FTA 찬성표 던진 분들

기억하겠습니다.

 
출처 : 자게
 
블로그 이미지

김유석0

,

생존왕

재밌는거 2011. 11. 19. 13:45
타이타닉 보았을때 기관장 모습은 정말 인상적이었습니다. 

침몰하는 배의 제일 밑바닥에서 마지막까지 배를 살리기 위해 노력하는...

그런데 몰랐었습니다.

그분이 생존왕이었을지는..

 



출처 : 자게

'재밌는거' 카테고리의 다른 글

내 손이 도구냐?  (0) 2011.11.26
냥이들  (0) 2011.11.26
야 사장새끼 오늘 안 나올것 같다.  (0) 2011.11.09
DC 인사이드의 명언 목록  (0) 2011.11.08
등산냥이  (0) 2011.11.06
블로그 이미지

김유석0

,

[GCC] -S 옵션?

development 2011. 11. 18. 11:58
아래와 같은 코드를 작성하였습니다.

test.c

#include <stdio.h>
int test(int i)
{
  printf("%d\n", i); return 0;
}

int main(int argc, char *argv[])
{
  int i;
  for(i=0;i<10;i++){
    test(i);
  }
  return 0;
}    
 
이 코드를 어셈블리 코드로 보고 싶다면?

gcc -S test.c    
 
-S 옵션을 붙여 주면 됩니다.
 
gcc -S test.c    
 
그럼 아래와 같이 어셈블리 코드로 볼 수 있습니다. 
 
    .file "test.c"
    .section .rodata
.LC0:
    .string "%d\n"
    .text
    .globl test
    .type test, @function
test:
.LFB0:
    .cfi_startproc
    pushl %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl %esp, %ebp
    .cfi_def_cfa_register 5
    subl $24, %esp
    movl $.LC0, %eax
    movl 8(%ebp), %edx
    movl %edx, 4(%esp)
    movl %eax, (%esp)
    call printf
    movl $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size test, .-test
    .globl main
    .type main, @function
main:
.LFB1:
    .cfi_startproc
    pushl %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl %esp, %ebp
    .cfi_def_cfa_register 5
    andl $-16, %esp
    subl $32, %esp
    movl $0, 28(%esp)
    jmp .L3
.L4:
    movl 28(%esp), %eax
    movl %eax, (%esp)
    call test
    addl $1, 28(%esp)
.L3:
    cmpl $9, 28(%esp)
    jle .L4
    movl $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE1:
    .size main, .-main
    .ident "GCC: (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1"
    .section .note.GNU-stack,"",@progbits
 
참고로 전 어셈코드를 못 봅니다. 능력이 안됩니다.
 
블로그 이미지

김유석0

,

아래와 같이 구현하면 어떻게 될까요?

Makefile

MODULE=multi_init

obj-m := $(MODULE).o
$(MODULE)-objs += check_money.o
$(MODULE)-objs += get_money.o
$(MODULE)-objs += put_money.o

KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all: 

     $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

clean: 

     rm -rf *.o *.ko *mod.c .*cmd .*versions Module.symvers modules.order  

 
check_money.c
#include <linux/init.h>
#include <linux/module.h>

int check_money_init(void)
{
  printk(KERN_ALERT "%s() : called\n", __FUNCTION__);
  return 0;
}

void check_money_exit(void)
{
  printk(KERN_ALERT "%s() : bye\n", __FUNCTION__);
}

module_init(check_money_init);
module_exit(check_money_exit);
MODULE_LICENSE("Dual BSD/GPL");
 
get_money.c
#include <linux/init.h>
#include <linux/module.h>

int get_money_init(void)
{
  printk(KERN_ALERT "%s() : called\n", __FUNCTION__);
  return 0;


void get_money_exit(void)
{
  printk(KERN_ALERT "%s() : bye\n", __FUNCTION__);
}

module_init(get_money_init);
module_exit(get_money_exit);
MODULE_LICENSE("Dual BSD/GPL"); 
  
put_money.c
#include <linux/init.h>
#include <linux/module.h>

int put_money_init(void)
{
  printk(KERN_ALERT "%s() : called\n", __FUNCTION__);
  return 0;


void put_money_exit(void)
{
  printk(KERN_ALERT "%s() : bye\n", __FUNCTION__);
}

module_init(put_money_init);
module_exit(put_money_exit);
MODULE_LICENSE("Dual BSD/GPL"); 
   


컴파일 하면 에러 납니다. 


module_init(), module_exit() 는 한 모듈당 하나씩만 사용 가능합니다.

가끔씩 이거 물어 보시는 분들이 있어서 정리해 놓았습니다.


 


블로그 이미지

김유석0

,


출처 : 자게

'재밌는거' 카테고리의 다른 글

냥이들  (0) 2011.11.26
생존왕  (1) 2011.11.19
DC 인사이드의 명언 목록  (0) 2011.11.08
등산냥이  (0) 2011.11.06
기회주의견  (0) 2011.10.26
블로그 이미지

김유석0

,
 Makefile 을 살펴보면

  obj-y := audio_device.o

 혹은

  obj-m := audio_device.o

 혹은

  obj-$(CONFIG_TEST) := audio_device.o

 와 같은 형태를 볼 수 있다.

 무슨 차이가 있을까? 

 커널소스 트리에 있는 각종 드라이버들은 모듈로 컴파일 될 수도 있고 커널 이미지에 바로 들어갈 수 도 있다.

 
  obj-$(CONFIG_TEST) := audio_device.o

 
위와 같이 정의하면 make menuconfig 결과에 따라 모듈이나 빌트인으로 알아서 컴파일 된다.

 그럼 빌트인으로 컴파일하라는 명령은?

  obj-y := audio_device.o

 이고

 모듈로 컴파일 하라는 명령은?

  obj-m := audio_device.o 

 이다.  

  간혹 보면 아래와 같이 구성되는 경우도 있다. 


  obj-y := target.o
  target-objs += audio_driver.o
  target-objs += i2s.o
 
이런 무슨 뜻일까? 색을 칠해 보았다. 

  obj-y := target.o
  target-objs += audio_driver.o
  target-objs += i2s.o
 
 풀어서 설명하면,
 
  audio_driver.c 와 i2s.c 를 컴파일한 후 하나로 묶어서
  target.o 를 만들것이고
  target.o 는 빌트인으로 커널 이미지로 들어가게 된다는 뜻이다. 


그럼 이것은?

  obj-m := target.o
  target-objs += audio_driver.o
  target-objs += i2s.o

다 똑같은데 모듈로 만들겠다는 것만 다르다. 

그럼 이것은?
 

  obj-$(CONFIG_TEST) := target.o
  $(CONFIG_TEST)-objs += audio_driver.o
  $(CONFIG_TEST)-objs += i2s.o
 
menuconfig 결과에 따라 모듈로 컴파일 될 수도, 빌트인으로 컴파일 될 수도 있다는 뜻이다.

끝.

 
블로그 이미지

김유석0

,
소스 구조가 아래와 같습니다. 

timer/timer.c
dummy/dummy.c

아래와 같이 구현하면 정상적으로 동작할까요?

timer/timer.c
#include <linux/init.h>

int timer(void)
{
  printk(KERN_ALERT "%s()\n", __FUNCTION__);

 

dummy/dummy.c
#include <linux/init.h>
#include "timer/timer.h"

int dummy(void)
{
  timer();

 

정답은 실패한다 입니다. 

리눅스 커널에서는 외부에 공개할 함수는 EXPORT_SYMBOL 이라는 매크로를 사용하여 지정해 주어야 합니다. 

위 소스들은 아래와 같이 수정하면 정상 동작합니다. 


 
timer/timer.c
#include <linux/init.h>

int timer(void)
{
  printk(KERN_ALERT "%s()\n", __FUNCTION__);


EXPORT_SYMBOL(timer);
 

dummy/dummy.c
#include <linux/init.h>
#include "timer/timer.h"

int dummy(void)
{
  timer();

 

참고로 static 함수는 EXPORT_SYMBOL 매크로를 사용해도 외부에서 접근할 수  없습니다. 왜냐면 static 이기 때문입니다.

 
블로그 이미지

김유석0

,

'고통이 없으면 성취도 없다.  근데 고통이 있다고 해서 성취도 있는 것은 아니다.'


'남들이 알아주지 않더라도 너의 일을 묵묵히 하다보면, 결국 남 좋은 일만 하게 된다.'


'너에게 닥친 고난이 아무리 커보이더라도, 명심해라, 아직 빙산의 일각일 뿐이다.'


'위험을 감수하지 않으면, 실패도 하지 않는다.'


'야망을 가지고 먼 여행을 하다보면, 완전히 x 되는 경우가 있다.'


'Never underestimate the power of stupid people in large groups'
(큰 집단에 있어서 어리석은 사람들의 힘을 절대 과소평가 하지마라.)


'승자 한 명당 패자는 열 명인데, 솔직히 너는 후자쪽일 것이다 '


'국가가 너에게 무엇을 해 주었는가를 생각하기 전에 니가 국가에 무엇을 해 줄 수 있는가를 생각하라.
어차피 국가는 너에게 무엇도 해주지 않을 것이다'


'열심히 일하다보면 언젠가 보상을 받기도 한다. 하지만 게으름을 피우면 당장 확실한 보상을 받는다. '


'외면이 아름다우면 내면 따위는 아무래도 좋다. '


'일찍 일어나는 벌레가 새한테 잡아먹힌다.' 


'일이 잘 안되어갈 때 포기하지 않으면, 흉해 보인다.' 


'남들이 널 필요로 한다고 해서, 그게 니가 중요한 사람이라는 뜻은 아니다.' 


'뛰는 놈 위에 나는 놈 있다, 그리고, 나는 놈 위에 등 붙어 가는 놈도 있다.' 


'성공한 사람은 디시를 할 수 있어도 디시를 하는 사람은 성공할 수 없다'


'여자는 별처럼 많다. 하지만 별처럼 먼 존재다' 


'디씨질과 담배는 끊는것이 아니다. 영원히 참는것이다'



.
.
.
.
.
.


"우리 서로의 의견을 존중하도록 하자. 물론 내가 맞고 니가 틀리지만"

'재밌는거' 카테고리의 다른 글

생존왕  (1) 2011.11.19
야 사장새끼 오늘 안 나올것 같다.  (0) 2011.11.09
등산냥이  (0) 2011.11.06
기회주의견  (0) 2011.10.26
추성훈의 무리수  (0) 2011.10.23
블로그 이미지

김유석0

,
커널에 새로운 작업 디렉토리를 추가하고 싶을 경우가 있습니다. 

만약 arm 시스템이고,

추가하고 싶은 디렉토리가


   kernel/RTSP 

이라면,

Step 1. 디렉토리 생성 및 Kconfig, Makefile 생성

  mkdir kernel/RTSP
  kernel/RTSP/Kconfig
  kernel/RTSP/Makefile  


을 만든후에

Step 2. 생성한 디렉토리 정보 등록

  kernel/arm/Kconfig 

파일에

  source RTSP/Kconfig

라고 한 줄 추가해 주고

ᅟStep 3. kernel/Makefile 수정
 

  # Objects we will link into vmlinux / subdirs we need to visit
 
RTSP-y := RTSP/ 

  vimlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
                      $(core-y) $(core-m) $(drivers-y) $(drivers-m)\
                      $(net-y $(net-m) $(libs-y) $(libs-m) $(RTSP-y) $(RTSP-m)))

  vmlinux-alldirs := $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/, \
                         $(init-n) $(init-) \
                         $(core-n) $(core-) $(drivers-n) $(drivers-)\
                         $(net-n) $(net-) $(libs-n) $(libs-) $(RTSP-n))))

  RTSP-y := $(patsubst %/, %/built-in.o, $(RTSP-y))

  vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y) $(RTSP-y)
 

 kernel/Makefile 은 워낙 내용이 많아서 수정해야 할 부분만 발췌해서 정리하였습니다. 제대로 사용하려면 직접 Makefile 을 보면서 수정해야 합니다. 
 
 

'development' 카테고리의 다른 글

[kernel] obj-y ? obj-m ? obj-$(CONFIG_TEST) ?  (1) 2011.11.08
[kernel] 개발한 함수를 외부에 공개하는 법  (1) 2011.11.08
[program] memmove  (0) 2011.10.27
[kernel] struct list_head  (0) 2011.10.26
[program] scandir()  (0) 2011.10.26
블로그 이미지

김유석0

,

서브버전 사용법

linux 2011. 9. 21. 11:16

서브버전 설치하는건 알아서 하시고.

 

1. 프로젝트 생성

  svnadmin create --fs-type fsfs project

 

2. 디렉토리 생성

  svn mkdir svn://svn/project/trunk

  svn mkdir svn://svn/project/branches

  svn mkdir svn://svn/project/tag

 

3. import

  svn import project svn://svn/project/trunk

 

4. check out

  svn co svn://svn/project/trunk ./project

 

5. update

  svn up

 

6. dump

  svnadmin dump [svn directory] > backup.dump

  svnadmin dump -r 10 [svn directory] > backup.dump

  svnadmin dump -r 10:20 [svn directory] > backup.dump


#!/bin/sh

cd /home/svn

for list in $(ls)
do
    echo $list
    svnadmin dump $list > ../svn_backup/$list.dump
done

7. restore

  svnadmin create tset

  svnadmin load test --fource-uuid < test.dump


 #!/bin/sh

for list in $(ls *.dump)
do
    TARGET=`echo $list|cut -f1 -d.`
    echo "RESTORE $TARGET"
    svnadmin create /home/svn/$TARGET
    svnadmin load /home/svn/$TARGET --force-uuid < $list
done


8. revision 번호만 따오는 법

 TARGET_RELEASE:=-r$(shell LC_ALL=C LANG=C svn info | awk '/Revision/ { print $$2 }')

 

 

블로그 이미지

김유석0

,