임베디드 리눅스 개발자는 하드웨어를 다루기 위해 디바이스 드라이버를 꼭 알아야 한다. 앞으로의 실습을 위해 기본개념부터 간단하게 소개한다.



목차

001. 운영체제로서의 리눅스

002. 리눅스 커널

003. 리눅스 드라이버



001. 운영체제로서의 리눅스

 운영체제의 이해를 위해서는 운영체제 구성하는 프로그램 소스와 설명 문서가 필요하다. Window같은 경우는 이러한 정보가 공개되어 있지 않지만 Linux의 경우 커널소스, 디바이스 드라이버 소스 등이 오픈소스로 제공되며 수많은 문서가 존재한다. 리눅스는 개발자들에 의해 수없이 수정되고 있으며 그 결과 우수한 성능을 보이며 메일 서버, 웹 서버 시스템, 임베디드 시스템 등 다양하게 쓰인다.



002. 리눅스 커널

 1) 리눅스 역사

 리누즈 토발즈가 만든 운영체제. 커널 + GNU프로젝트가 합세하면서 리눅스가 개발됨. 가장 사용화 됫던 버전은 2.6x 3.1x 등이있으며 현재 4.x 버전까지 나왔다. 컴파일러 : gcc


  2) 리눅스 커널의 기능

    - 프로세서 관리 

      병렬 프로세서 또는 시스템 프로세스를 효율적으로 할당하고 수행하도록 관리한다.


    - 프로세스 관리

 최소한 하나 이상의 프로세스가 동작, 태스크라고도 하며 일을 수행하는 기본 단위. 스케쥴러를 이용하여 여러 프로세스를 parallel하게 관리한다.


    - 메모리 관리

 프로세스 또는 실행 이미지가 동작하도록 가상 주소 공간을 제공하며 여러 보조 기억 장치 등이 존재한다.


    - 파일 시스템 관리

리눅스는 파일 시스템을 근간으로 설계 되었다. 리눅스 커널에 동작하는 모든 자원을 파일처럼 볼 수 있도록 통일된 인터페이스를 제공


- 디바이스 제어

하드웨어를 제어하기 위해서는 커널에서 디바이스 드라이버가 구현되어야 하며 디바이스 드라이버를 통해 주변 장치를 제어 할 수 있다.


- 네트워크 관리

리눅스 커널은 우수한 네트워크 관리 시스템을 가지고 있음 네트워크 디바이스 드라이버를 통해 효과적으로 네트워크 처리를 하고 있다. 암호화와 보안 특성이 견고하다.


  3) 리눅스 커널의 특징

프로세서와 시스템 메모리에 상주하면서 여러 자원을 관리하며 다중 프로세스를 구현한다. 배포된 소스를 사용자가 직접 수정할 수 있으며, 현존하는 운영체제중에서 가장 많은 프로세서와 플랫폼을 지원하며, 임베디드 시스템에서부터 엔터 프라이즈 환경까지 커버한다.


    - 모놀리식 커널

UNIX방식의 모놀리식 커널이며 OS를 구성하는 일반적 기능과 커널을 동일한 메모리 공간에 적재한 기법을 말한다. 마이크로 커널의 경우 Contrext switching이나 Process 간 통신이 이루어질 때 Cluck의 실행 비용 문제가 생기지만 모놀리식 커널은 동일 메모리에 있기 떄문에 이러한 요소를 줄일 수 있는 장점이 있다.


- 비선점형(커널 2.4) 선점형(커널 2.6)

비선점형 : 한 Process가 진행 될 때 CPU자원을 점유하게 되고, 이 프로세스가 종료되거나 인터럽트에 의한 종료가 되기 전까지 계속 점유되는 것을 말한다.

선점형 : CPU에서 이미 점유된 process가 있다 하더라도 이것을 중지하고 다른 process를 우선 처리 할 수 있다.


- 가상 메모리 시스템(VM)

http://akaseon.tistory.com/55

물리적 메모리 장치의 한계를 극복 할 수 있는 메모리 관리 기법으로써 MMU가 가상주소와 물리주소를 관리해 주는 역할을 한다. ARM의 경우 Cortex-A는 MMU가 존재하지만 비교적 가볍고 빠른처리를 지원하는 임베디드 특화된 Cortex-M같은 경우 MMU가 존재하지 않는 경우도 있다.


- No MMU 지원

자원이 제한적이거나 소량의 처리만 하는 임베디드 시스템의 경우 MMU디바이스가 없는 경우도 있다. Linux는 MMU가 없는 시스템도 지원한다.


- 가상 파일 시스템(VFS)

리눅스 커널의 가장 큰 특징 중 하나이며 다른 OS의 파일 시스템을 처리 할 수 있으며 사용자는 OS에 상관 없이 서로 다른 파일 시스템을 이용 할 수 있다. 대표적으로 ext2 부터 저널링 파일 시스템인 jfs를 수용 할 수 있으며 윈도우에서 동작하는 NTFS파일 시스템과 DOS용 파일 시스템도 처리 할 수 있다.


- 모듈을 이용한 커널 확장

커널 모듈이란 필요에 따라 커널에 로드하거나 언로드 할 수 있는 특정한 기능을 말한다. 리부팅 작업이 필요 없이 로드 언로드가 가능하며 자원 낭비 또한 줄일 수 있다. $lsmod를 통해 동작 모듈을 확인 가능하다.


- 커널 스레드

http://timewizhan.tistory.com/entry/%EC%BB%A4%EB%84%90-%EC%8A%A4%EB%A0%88%EB%93%9C%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-1

커널에만 존재하는 스레드. $ps -ef를 통해 확인 가능하며 [??]이 되어 있는 것이 커널 스레드이다. 보통 프로세스를 for할 때 context switching에 따른 cpu자원 소모가 일어나게 되는데 커널에서만 동작하기 때문에 이러한 자원 사용을 줄일 수 있다.


- 멀티스레드 지원

프로세스를 생성하는 비용이 많이 들기 때문에 프로세스 관리 기법에서 경량화 된 멀티 스레드를 지원한다. MMU를 지원하지 않는 CPU에서는 메모리의 제한적 사항 때문에 process for보다 멀티 스레드 사용을 권장한다.


- 강력한 네트워크 지원

BSD 네트워크 처리 방식이기 떄문에 안정성이 높다. 또한 다양한 네트워크 디바이스 드랑리버를 지원한다


- GPL 라이선스 (General PUblic License)

GPL 코드를 사용한 SW는 반드시 공개해야 된다.




  4) 커널 소스의 구조



 Documentation  

 커널에 관련된 여러 문서들이 있다. 커널 소스를 분석할 때 먼저 참고하는 편이 좋다.

 arch            

 아키텍쳐 의존적인 코드들이 있다. 보통 boot, kernel, lib, mm 으로 구현되어 있다. 

 crypto           

 암호 처리 공동 함수

 drivers        

 각종 디바이스를 제어하기 위한 드라이버

 block, cdrom, char, net, pci, pnp, sbus, scsi, sound 등

 fs

 버추얼 파일 시스템 인터페이스

 coda, ext2, hpfs, msdos, nfs, ntfs, utfs 등

 include

 커널에 관계된 헤더 파일, asm-*은 아키텍쳐 관련, linux는 커널 관련 

 init             

 리눅스 커널 부팅할 때 호출되는 각종 초기화 처리 

 ipc            

 전통적 프로세스간 통신, 세마포어, 공유메모리, 메시지 큐

 kernel            

 커널의 핵심 코드. 시스템콜, 스케쥴러, 시그널 핸들링 등 

 lib

 kernel의 다른 부분에 의해 필요로 하는 라이브러리 코드. 예로 inflate.c는 부팅시  kernel 압출을 해제하고 메모리에 로드한다.

 mm

 버추얼 메모리 관리, 페이징, 커널 메모리

 net

 네트워크를 지원하며 많은 프로토콜이 있다.

 802.11, IPX, appletalk, ethernet, ipv6, bluetooth ...

 scripts

 커널이미지를 만들어주는 스크립트나 실행 파일이 있다.

 security

 보안 처리

 sound

 사운드 관련

 usr

 initramfs 시스템 구축 예제

 참고

 http://plucky.tistory.com/26   http://mintnlatte.tistory.c/162


    - Doccumentation

    디바이스 드라이버 작성자에게 필수 참고내용이 있는 디렉토리이다. 디바이스 드라이버 구현 방법 및 주의사항에 대한 내용들이 있다. 커널 컴파일과 관련된 문법 구조를 이해하고 싶으면 kbuild를 살펴 볼 것



    - arch

아키텍쳐(플랫폼)의 독립적인 소스코드가 존재한다.

alpha, arm, avr, blackfin, cris, frv, h8300, ia64, m32r, m68k, m68knommu, microblaze, mips, mn10300, parisc, powerpc, s390, sh, sparc, um, x86(i386), x86_64(i386의 64bit) 등이 있다. 


arch/kernel : Context switching, Thread Management

arch/lib : kernel이 사용하는 library의 구현 (하드웨어 dependent이기 때문에 일반 library보다 빠르다)

arch/mm : memory management 중에서 page fault 같은 hardware dependent한 부분을 구현

arch /boot : 부트스프랩트코드, 메모리 / 디바이스 설정



    - include

디바이스 드라이버를 작성하는 경우에 커널 소스를 추적해야 하는 경우도 있지만 헤더 파일을 찾는 경우가 더 많다. include/asm에는 아키텍쳐와 관련된 파일을, include/linux에는 리눅스 커널에서 아키텍처에 영향을 받지 않는 헤더 파일을 모아 놓는다 include/linux를 잘 살펴볼 것



  5) 커널 소스 탐색

grep 명령어 조합 (http://forum.falinux.com/zbxe/index.php?document_srl=562106&mid=lecture_tip)

Linux : Vi plugin 이용 (cscope, ctags, NerdTree)

Windows : Source insight를 이용

cscope 이용  (http://iamroot.org/wiki/doku.php?id=%EC%8A%A4%ED%84%B0%EB%94%94:cscope_%EC%82%AC%EC%9A%A9%EB%B2%95)
































+ Recent posts