= 임베디드 리눅스 실전 가이드 = -- [김도집] [[DateTime(2005-08-24T02:41:25)]] [[TableOfContents]] == 개요 == == 저작권 == 본 내용에 대한 것은 자유롭게 배포 가능하다. 단, 출처는 명시해야 하며, 임의 수정 배포는 허용하지 않는다. == 용어 == == 툴체인 == === 라이브러리 === ==== zlib ==== zlib은 널리 사용되는 압축 라이브러리이다. zlib 1.2.2 버전 이하에서는 보안 문제가 있으므로 반드시 최신 버전을 사용하기 권한다. zlib는 다음의 사이트에서 구할 수 있다: [http://www.zlib.net] ===== 빌드 하기 ===== 다음은 zlibc 1.2.3의 빌드 과정이다. 1. ./configure 또는 ./configure --shared 를 실행한다. --shared 옵션은 zlib 라이브러리를 동적으로 만들라는 의미이다. {{{ ./configure --shared --prefix=/usr/local/arm/arm-uclibc-3.3.5 }}} 1. Makefile 을 다음과 같이 수정한다: {{{ CROSS=arm-linux- CC=$(CROSS)gcc LDSHARD=$(CROSS)gcc -shared -Wl,-soname,libz.so.1 CPP=$(CROSS)gcc -E AR=$(CROSS)ar rc RANLIB=$(CROSS)ranlib }}} 1. make install 를 실행하여 빌드된 것을 설치한다. == 부트로더 == == 커널 == === 모듈 프로그래밍 === ==== Makefile 만들기 ==== 커널 2.6에서는 외부 모듈의 빌드를 커널 소스 내의 빌드 시스템을 이용한다. 예를 들어 foobar.ko 라는 커널 모듈을 만든다고 하면 다음과 같이 Makefile 파일을 만든다. {{{ ifneq ($(KERNELRELEASE),) #call from kernel build system foobar-objs := foo_1.o foo_2.o obj-m := foobar.o else KERNELDIR ?= /YOUR/KERNEL/SOURCE/PATH PWD := $(shell pwd) modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif clean: rm -rf *.o *~ core .depend .*.cmd .*.o.d *.ko *.mod.c .tmp_versions }}} /!\ Makefile에서 실행 명령 행 첫 공백은 '''TAB'''으로 띄워야 한다. 공백 문자가 아니다 === 비동기 === ==== 시그널 ==== 커널에서 호출한 프로세스로 시그널을 전달할 수 있다. 시그널 호출 시 전달되는 데이터는 siginfo 구조체로 정의되어 있다. 다음은 include/asm-generic/siginfo.h에 정의되어 있는 내용 중 일부이다. {{{#!vim C typedef struct siginfo { int si_signo; int si_errno; int si_code; union { ... } _sifields; } siginfo_t; #define si_pid _sifields._kill._pid ... #define si_int _sifields._rt._sigval.sival_int ... }}} 사용할 수 있는 함수들은 다음과 같다. ||recalc_sigpendign|| || ||dequeue_signal|| || ||flush_signals|| || ||force_sig|| || ||kill_pg|| || ||kill_proc||호출한 프로세스(pid)에 signal을 보내고 siginfo를 인자로 넘긴다|| ||ptrace_notify|| || ||send_sig|| || ||send_sig_info|| || ||sigprocmask|| || ||block_all_signals|| || ||unblock_all_signals|| || 시그널 함수 중 kill_proc()함수는 다음과 같이 이용할 수 있다. {{{#!vim C struct siginfo info; info.si_signo = SIGUSR2; info.si_errno = 0; info.si_code = SI_QUEUE; info.si_int = flags; if (kill_proc(cpid, SIGUSR2, (int)&info)) kill_proc(cpid, SIGINT, 1); }}} 프로세스(cpid)에 SIGUSR2 시그널을 보낸다. 보내는 것에 실패한다면 SIGINT를 보내게 된다. === 메모리 === ==== IO 메모리 ==== IO 메모리에 관련된 인터페이스는 에 정의되어 있다. IO를 위한 메모리를 할당은 다음과 같이 한다. {{{#!vim C char *name = "MyIO"; if (!request_mem_region(phys, size, name)) return -EBUSY; virt = ioremap(phys, size); }}} * phys : 물리 메모리 시작 번지 * size : IO 메모리로 할당할 메모리의 크기 할당 받은 IO 메모리를 해제하는 경우는 다음과 같다. {{{#!vim C release_mem_region(phys, size); iounmap((void *)virt); }}} * virt : 해제할 가상 메모리 시작 번지 == 응용 프로그램 == == 참고 ==