맞춤검색
2009.07.22 09:33

리눅스 커널 구조(커널 소스와 OS management와의 matching)

 아시다시피..OS management에는 크게 5가지가 있다.

1. Process Scheduling
2. File System Management
3. Memory Management
4. Network Management
5. I/O Management

Linux kernel 의 구조를 살펴보면

사용자 삽입 이미지

전체적인 구조가 위와 같이 되어 있다.
Kernel에 익숙한 사람이라면 어디에 무엇이 있고 이런 것이 너무나 당연하고 익숙하겠지만..
필자와 같이 초보들은 방대한 커널 소스의 양에 혀를 내두를 것이다.
그래서 인터넷에 떠돌아 다니는 커널의 대략적인 구조와 분석을 참고하여 OS management 차원에서 커널의 구조를 분석해 보았다.

일단, 커널의 구조는 위와 같이 보았으니, 커널 디렉토리에 있는 각각의 디렉토리가 어떤 역할을 하는지 대략적으로 적어보기로 하겠다. 물론 이것은 어디에 가도 구할 수 있는 내용이긴 하지만..

1. kernel/ Directory
 kernel function이라 불리는 일부가 위치함. Task의 생성과 소멸, 프로그램 실행, Scheduling, signal 처리 등의 기능. context switching 같은 hardware 종속적인 부분은 arch/$(ARCH)/kernel에 있음.$(ARCH)는 CPU 의미.(i386,arm...)

2. arch/ Directory
 architecture dependent code, 말 그대로 hardware에dependent한 부분들이 구현되어 있다. 이것은 대략적으로 다음과 같이 구성된다.
   (1) kernel/ : Context Switchig, Thread Management
   (2) lib/ : kernel이 사용하는 library의 구현.(Hardware dependent이기 때문에 일반 library보다 빠르다)
   (3) mm/ : memory management 중에서 page fault 같은 hardware dependent한 부분을 구현

3. fs/ Directory
 지원되는 file system 을 위한 장소(약 50개 정도 지원)

4. include/ Directory
 kernel이 사용하는 헤더파일 구현.arch/lib와 다른 점은, 이 부분은 hardware independent한 code이다.

5. ipc/ Directory
 ipc를 하는데 필요한 코드들. Semaphore, Message passing, Shared memory

6. init/ Directory
 Kernel의 initialization과 관련된 코드.kernel의 메인함수가 구현돼 있다. arch/$(ARCH)/kernel/에 있는 head.S, mics.c에서 hardware적인 initialization이 이루어지고 난 후, init/에 있는 start_kernel()이라는 C함수로 제어가 넘어오게 된다. 이 함수가 global한 initialization을 수행하게 된다. fork() 구현되어 있는 코드이고 cpu_idle() loop가 포함되어 있다.

7. drivers/ Directory
 모든 device driver의 source code가 여기에 존재함. device driver를 3가지 종류로 구분함.
   (1) FS를 통해서 접근되는 block device driver
   (2) User mode application이 장치파일을 통해 직접 접근하는 character device driver
   (3) TCP/IP를 통해서 접근되는 Network device driver

8. net/ Directory
 Network 지원 source code. TCP/IP, Netware, UNIX domain network protocol, 802.11, IPX, AppleTalk, bluetooth ...

9. mm/ Directory
 memory management가 구현됨. physical memory, virtual memory, task마다 할당되는 memory object management 등..

10. lib/ Directory
 kernel의 다른 부분에 의해 필요로 하는 코드를 종종 가진다. 예로, inflate.c는 부팅시 kernel을 압축 해제하고 메모리에 로드한다.

11. Others: Documentation/ Directory

그럼 OS management에 따라서 이 코드들이 어떻게 분류될 수 있는지 보기로 하자. (사실 이것도 코드 설명을 보면 바로 알 수 있는 내용이긴 하지만....)

1. Process Scheduler
kernel/ , arch/kernel/
init/
ipc/
include

2. File System Management
fs/
3. Memory Management
mm/
4. Network Management
net/
5. I/O Management
drivers/

6.  그 밖에 hardware에 dependent한 부분들은(memory management,
init 부분) arch/에서 구현됨

사실 커널이란 것이 한 management의 코드가 특정한 곳에만 존재하는 것이 절대 아니지만.. 처음 포팅 등을 할 때 무작정 달려드는 것보다는 이렇게 대략적으로라도 알고 가는 것이 좋을 것 같아서 포스팅을 해보았다. (나도 포팅 한답시고 무작정 코드만 봤던 걸 생각하면 어휴.. 지금 생각하면 그 당돌함에 손발이..)
Trackback 0 Comment 2
  1. ;.,; 2009.07.22 12:49 신고 address edit & del reply

    알긴뭘알아

  2. zzalmock 2011.03.28 15:20 신고 address edit & del reply

    좋은자료 감사합니다.
    퍼 갈께요 ^^;



티스토리 툴바