Linux 커널의 신비함을 정통적으로 배우는

kernel & device driver

수강대상

커널 포팅, 임베디드, 디바이스 드라이버개발에 관심이 많은 학생 또는 개발자

선수과정

없음

강의환경

linux kernel 2.6.11
xcale 270


“문: 커널은 공부하는 것은 어렵 습니까?”
“답: 커널은 어렵다”
이 말은 누구에게 물어 보아도 한결 같은 답이 나올 것입니다.


지금 리눅스 커널을 개발하는 해커들은 원래가 MIT나 bell 연구소 같은 세계적인 대학이나 연구소 출신의 경력이 30년쯤된 개발자 들입니다.


이런 사람들이 만드는 프로그램에 대해서 감히 쉽다고 말하는 자가 있을 까요?
그런 사람이 있다면 원래 천재인 리누스 토발즈나 알랜 콕스보다 더 천재이거나, 아니면 커널을 너무 모르는 오만에 젖은 사람일 것입니다.


커널이 어렵긴 하지만 아예 범접하지 못할 영역은 아닙니다. 커널의 기본 자료구조 부터, 프로세스 스케줄링을 시작으로 분석 하고 너무 하드웨어에 의존적인 부분을 배재 한다면 노력과 시간이 많은 부분을 해결해 줄 것입니다.


너무나 빨리 발전하는 리눅스를 쫓아 갈수는 없겠지만 커널 2.4든 2.6이든 하나의 버전을 몇년동안 분석한다면 언제가는 전체가 보이는 날이 올 것입니다. 그 경지에 이른다면 무엇이 두렵겠습니까?


개발자의 최종 단계이자 로망인 커널 개발자가 될려면 넘어야 할 산이 너무 많습니다.

기본적으로 c를 완전히 마스터 해야 하며( 커널에 쓰인 c언어는 그것이 c언어 문법이 맞는지 조차 모를 수많은 테크닉이 숨어 있습니다.) ,자료구조( list, tree, hash .. )에 대한 깊은 지식이 있어야 합니다.
또한 함수 포인터를 이용한 가상 파일 시스템, 네트워크 패킷 전달 과정과 같은 layered 개발 방법론을 이해 해야 합니다.


AT&T 어셈블리언어를 가볍게 해석하고 사용할 줄 알아야 하며, hardware의 spec과 , 메모리의 cpu별 동작 모드, 유저모드와 커널모드의 차이점, 리소스 보호를 위한 동기화 제어 , 메모리의 외부단편화를 줄이기 위해 등장한 버디시스템, 내부 단편화를 최소화 하기위한 slab allocator등 이루 해아릴 수 없을 만큼의 지식이 필요 합니다.


이에 이과정은 위에 언급한 내용들을 커널 소스 위주로 단위별로 분석하고 커널을 패치 하여 우리가 원하는 커널을 만드는데 목적을 두고 있습니다.


커널을 이해 한다면 유저와 커널간의 통신방법인 디바이스 드라이버는 간단한 몇가지만 하면 됩니다.

커널을 공부하면서 우리 보다 먼저 이 반열에 선 여러 선인들의 지혜와 고민들을 알아가는 중요한 시간이 되었으면 합니다.

  • Section1. 커널 자료구조
    • 리눅스 커널 개요 , 커널 컴파일 기법
    • 시스템 콜 추가
    • 커널내 list, hash 자료구조 분석
    • 커널내 tree, bitmap 자료구조 분석
    • 유저모드/커널모드, 프로세스 상태 분석
  • Section2. 프로세스/메모리
    • 프로세스 컨텍스트 스위칭, 스케줄링 분석
    • 메모리 관리 기법( 세그멘테이션, 페이징)
    • 메모리 교체 알고리즘 분석(LRU,LFU,FIFO)
    • buddy 시스템 , slab allocation
    • 파일시스템( 가상파일시스템, 다형성, 레이어드 개발법 )
  • Section3. 디바이스 드라이버
    • 인터럽트 , 동기화 제어, 프로세스간 통신
    • 커널 모듈 프로그래밍
    • 디바이스드라이버 개요
    • 인터럽트, 문자 디바이스 드라이버 구현
    • 블록 디바이스 드라이버 구현
  • Section4. 네트워크 커널
    • Inet socket, BSD socket
    • skbuff와 내부 구동 원리
    • 패킷 송수신 전과정 분석
    • network kernel을 수정하여 패킷 제어