FSTWikiRev. 1.41 EmbeddedLinuxGuide
Login:
Password:
Join
E D R S I H P RSS
FrontPage|FindPage|TitleIndex|RecentChanges

임베디드 리눅스 실전 가이드 #

-- 김도집 2005-08-24 11:41:25

Contents

1 임베디드 리눅스 실전 가이드
1.1 개요
1.2 저작권
1.3 개발 도구
1.3.1 scratchbox
1.3.1.1 설치 on the debian
1.3.1.2 scratchbox에서 toolchain 만들기
1.3.1.3 scratchbox에서 kegel의 crosstool로 만들기
1.3.2 uclibc를 이용한 toolchain 만들기
1.3.3 kegel의 toolchains 만들기
1.3.4 xscale toolchains 빌드 분석
1.3.5 binutiles
1.3.6 라이브러리
1.3.6.1 zlib
1.3.6.2 libjpeg
1.3.6.3 libpng
1.3.7 사용자 정의 라이브러리
1.3.7.1 정적 라이브러리 만들기
1.3.7.2 동적 라이브러리 만들기
1.3.7.3 라이브러리 사용하기
1.3.8 Autotools
1.3.9 Make/Makefile
1.3.9.1 Makefile 일괄 처리
1.3.10 ?SCons
1.3.11 vim
1.3.12 ctags
1.3.13 디버깅
1.3.13.1 gdb
1.3.13.1.1 Cross-GDB compilation
1.3.13.1.2 gdb 사용
1.3.13.2 사용자 모드 디버깅
1.3.13.3 커너 모드 디버깅
1.3.13.3.1 kgdb
1.3.13.3.2 kdb
1.3.14 Doxygen
1.3.15 테스트
1.4 부트로더
1.5 커널
1.5.1 모듈 프로그래밍
1.5.1.1 Makefile 만들기
1.5.1.2 간한단 모듈 예
1.5.2 프로세스
1.5.3 비동기
1.5.3.1 시그널
1.5.4 메모리
1.5.4.1 IO 메모리
1.6 램디스크
1.7 응용 프로그램
1.7.1 Makefile (skelecton)
1.7.2 프로세스
1.7.3 시그널
1.8 참고


1.1 개요 #

1.2 저작권 #


본 내용에 대한 것은 자유롭게 배포 가능하다. 단, 출처는 명시해야 하며, 임의 수정 배포는 허용하지 않는다.

1.3 용어 #


1.4 툴체인 #

1.4.1 라이브러리 #

1.4.1.1 zlib #

zlib은 널리 사용되는 압축 라이브러리이다.


zlib 1.2.2 버전 이하에서는 보안 문제가 있으므로 반드시 최신 버전을 사용하기 권한다.


zlib는 다음의 사이트에서 구할 수 있다: [http]http://www.zlib.net
1.4.1.1.1 빌드 하기 #
다음은 zlibc 1.2.3의 빌드 과정이다.


  1. ./configure 또는 ./configure --shared 를 실행한다.

    --shared 옵션은 zlib 라이브러리를 동적으로 만들라는 의미이다.
  2. ./configure --shared --prefix=/usr/local/arm/arm-uclibc-3.3.5
    


  3. 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
    


  4. make install 를 실행하여 빌드된 것을 설치한다.

1.4.2 사용자 정의 라이브러리 #

사용자가 직접 라이브러리를 만들어 사용할 수 있다. 이럴 때는 라이브러리를 만들어 사용하는 것이 좋다:


  • 소스 코드를 공개하고 싶지 않을 때
  • 동일한 코드를 여러 프로그램에서 반복적으로 사용할 때


    라이브러리는 두 가지 타입이 있다. 정적 라이브러리와 동적 라이브러리이다. 정적 라이브러리를 이용하는 경우엔 이 라이브러리를 사용하는 실행 파일에 라이브러리가 포함이 된다. 반면에, 동적 라이브러리를 이용하는 경우엔 실행 파일에 라이브러리가 포함되지 않고 동적으로 라이브러리를 참조하여 사용하게 된다. 즉, 여러 프로그램에서 동일한 라이브러리를 반복적으로 사용하는 경우엔 동적 라이브러리로 생성하여 사용하는 것이 좋다.


    그외에도 라이선스 문제도 있는데, 정적 라이브러리의 경우 실행 파일에 라이브러리 자체가 포함되므로 GPL 라이선스의 영향을 받지만, 동적 라이브러리의 경우엔 이러한 문제를 피해갈 수도 있다.
  • 1.4.2.1 정적 라이브러리 만들기 #

    정적 라이브러리는 object 파일들을 하나의 파일로 만든 것이라고 보면 된다. ar 이라는 명령을 이용하여 만든다.
    ar rcs 정적라이브러리명.a 파일1.o 파일2.o 파일3.o ... 
    


    예를 들어 파일1.o, 파일2.o를 libmy.a라는 정적 라이브러리로 만든다면 다음과 같이 만든다:
    ar rcs libmy.a 파일1.o 파일2.o
    

    1.4.2.2 동적 라이브러리 만들기 #

    1.5 부트로더 #

    1.6 커널 #


    1.6.1 모듈 프로그래밍 #

    1.6.1.1 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으로 띄워야 한다. 공백 문자가 아니다

    1.6.2 비동기 #

    1.6.2.1 시그널 #

    커널에서 호출한 프로세스로 시그널을 전달할 수 있다. 시그널 호출 시 전달되는 데이터는 siginfo 구조체로 정의되어 있다.


    다음은 include/asm-generic/siginfo.h에 정의되어 있는 내용 중 일부이다.
    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()함수는 다음과 같이 이용할 수 있다.
    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를 보내게 된다.


    1.6.3 메모리 #

    1.6.3.1 IO 메모리 #

    IO 메모리에 관련된 인터페이스는 <linux/ioport.h>에 정의되어 있다. IO를 위한 메모리를 할당은 다음과 같이 한다.
    char *name = "MyIO";
    
    if (!request_mem_region(phys, size, name))
      return -EBUSY;
    
    virt = ioremap(phys, size);
    
  • phys : 물리 메모리 시작 번지
  • size : IO 메모리로 할당할 메모리의 크기


    할당 받은 IO 메모리를 해제하는 경우는 다음과 같다.
    release_mem_region(phys, size);
    iounmap((void *)virt);
    
  • virt : 해제할 가상 메모리 시작 번지

  • 1.7 응용 프로그램 #


    1.8 참고 #


    last modified 2006-05-11 08:05:34
    ShowPage|FindPage|DeletePage|LikePages Valid XHTML 1.0! Valid CSS! powered by MoniWiki
    0.1225 sec