'poplinux'에 해당되는 글 40건
- 2011.11.23 FTA 찬성표 던진 분들
- 2011.11.19 생존왕 1
- 2011.11.18 [GCC] -S 옵션?
- 2011.11.17 [kernel] module_init(), module_exit()
- 2011.11.09 야 사장새끼 오늘 안 나올것 같다.
- 2011.11.08 [kernel] obj-y ? obj-m ? obj-$(CONFIG_TEST) ? 1
- 2011.11.08 [kernel] 개발한 함수를 외부에 공개하는 법 1
- 2011.11.08 DC 인사이드의 명언 목록
- 2011.11.07 [kernel] 커널에 새로운 작업 디렉토리를 추가하고 싶다면
- 2011.09.21 서브버전 사용법
침몰하는 배의 제일 밑바닥에서 마지막까지 배를 살리기 위해 노력하는...
그런데 몰랐었습니다.
그분이 생존왕이었을지는..
출처 : 자게
'재밌는거' 카테고리의 다른 글
내 손이 도구냐? (0) | 2011.11.26 |
---|---|
냥이들 (0) | 2011.11.26 |
야 사장새끼 오늘 안 나올것 같다. (0) | 2011.11.09 |
DC 인사이드의 명언 목록 (0) | 2011.11.08 |
등산냥이 (0) | 2011.11.06 |
test.c
{ printf("%d\n", i); return 0; } int main(int argc, char *argv[]) { int i; for(i=0;i<10;i++){ test(i); } return 0; } |
이 코드를 어셈블리 코드로 보고 싶다면?
-S 옵션을 붙여 주면 됩니다.
그럼 아래와 같이 어셈블리 코드로 볼 수 있습니다.
.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 |
참고로 전 어셈코드를 못 봅니다. 능력이 안됩니다.
'development' 카테고리의 다른 글
[etc] 빌드 시스템 (0) | 2011.12.23 |
---|---|
[kernel] Thread 와 Kill (0) | 2011.11.26 |
[kernel] module_init(), module_exit() (0) | 2011.11.17 |
[kernel] obj-y ? obj-m ? obj-$(CONFIG_TEST) ? (1) | 2011.11.08 |
[kernel] 개발한 함수를 외부에 공개하는 법 (1) | 2011.11.08 |
아래와 같이 구현하면 어떻게 될까요?
Makefile
MODULE=multi_init 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> 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> 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> 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() 는 한 모듈당 하나씩만 사용 가능합니다.
가끔씩 이거 물어 보시는 분들이 있어서 정리해 놓았습니다.
'development' 카테고리의 다른 글
[kernel] Thread 와 Kill (0) | 2011.11.26 |
---|---|
[GCC] -S 옵션? (0) | 2011.11.18 |
[kernel] obj-y ? obj-m ? obj-$(CONFIG_TEST) ? (1) | 2011.11.08 |
[kernel] 개발한 함수를 외부에 공개하는 법 (1) | 2011.11.08 |
[kernel] 커널에 새로운 작업 디렉토리를 추가하고 싶다면 (0) | 2011.11.07 |
출처 : 자게
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 결과에 따라 모듈로 컴파일 될 수도, 빌트인으로 컴파일 될 수도 있다는 뜻이다.
끝.
'development' 카테고리의 다른 글
[GCC] -S 옵션? (0) | 2011.11.18 |
---|---|
[kernel] module_init(), module_exit() (0) | 2011.11.17 |
[kernel] 개발한 함수를 외부에 공개하는 법 (1) | 2011.11.08 |
[kernel] 커널에 새로운 작업 디렉토리를 추가하고 싶다면 (0) | 2011.11.07 |
[program] memmove (0) | 2011.10.27 |
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 이기 때문입니다.
'development' 카테고리의 다른 글
[kernel] module_init(), module_exit() (0) | 2011.11.17 |
---|---|
[kernel] obj-y ? obj-m ? obj-$(CONFIG_TEST) ? (1) | 2011.11.08 |
[kernel] 커널에 새로운 작업 디렉토리를 추가하고 싶다면 (0) | 2011.11.07 |
[program] memmove (0) | 2011.10.27 |
[kernel] struct list_head (0) | 2011.10.26 |
'고통이 없으면 성취도 없다. 근데 고통이 있다고 해서 성취도 있는 것은 아니다.'
만약 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 |
서브버전 설치하는건 알아서 하시고.
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 }') |
'linux' 카테고리의 다른 글
윈도우용 서브버전 클라이언트 TOTOISE (0) | 2011.09.21 |
---|---|
windows hosts 파일 위치 (0) | 2011.09.21 |
삼바 마운트 하는법 (0) | 2011.09.21 |
BuildRoot 시스템 (0) | 2011.09.21 |
윈도우 공유 디렉토리를 리눅스에서 마운트 하는 법 (0) | 2011.03.25 |