Unix & Linux/Kernel

리눅스 커널 소스 ( Linux Kernel Source )

LEEHANDS 2021. 7. 21. 16:37
반응형

참고 사이트 : http://wiki.kldp.org/Translations/html/The_Linux_Kernel-KLDP/

리눅스 소스 트리

 

1. Kernel

  : 리눅스 커널 동작을 제어하는 기본 기능

2. mm

  : 리눅스 커널의 메모리 관리 (물리메모리, 가상메모리)

3. fs 

  : 가상 파일 시스템 , 서브 디렉토리 아래에 각종 파일 시스템이 존재

  : vfat / ext2 같은 서브디렉토리가 있다.

4. net

  : 각종 네트워크 프로토콜에 관한 코드

5. ipc

  : System V IPC ( 공유메모리, 세마포어, 메시지)

  : IPC 란 : Inter-Process Communication, 프로세스 간 통신

6. init

  : 리눅스 커널을 부팅할 때 호출되는 각종 초기화 처리의 본체

  : 커널이 어떻게 동작하는지 보기 시작하기에 좋은 곳이다.

7. crypto

  : 암호 처리 공통함수

8. block

  : 블록 디바이스 제어를 위한 공통 처리

9. drivers

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

  : 디바이스 드라이버의 유형별로 세분화 되면, 블럭 디바이스 드라이버는 block 에 있다.

10. sound

  : 사운드 드라이버

11. arch

  : 각종 CPU 아키텍처에 종속적인 코드, 다양한 CPU용 코드가 CPU 아키텍처마다 서브 디렉토리에 존재

  : 예를들어 i386 / arm 같은 이름의 서브디렉토리 존재

12. include

  : 리눅스 커널 컴파일시 참조하는 각종 헤더파일, CPU 아키텍처에 종속적인 헤더는 asm 으로 시작되는 이름의 서브디렉토리 아래에 존재.

 

 

2. 어디서부터 디버깅을 시작해볼까?

2-1. 시스템 시작과 초기화

인텔기반 시스템에서 커널은 loadlin.exe 나 LILO 가 리눅스 커널을 메모리로 읽어들인 후 커널에 제어권을 넘겨줌으로써 시작한다.

이부분에 대해서는 arch/i386/kernel/head.S 를 보기바란다.

head.S 는 아키텍쳐 종속적인 셋업을 한 후 init/main.c 에 있는 main() 루틴으로 점프한다.

2-2. 메모리 관리

이 코드는 대부분 mm 에 있지만 아키텍쳐 종속적인 코드는 /arch/*/mm 에 있다. 페이지 폴트처리 코드는 mm/memory.c 에 있고, 메모리 매핑과 페이지 캐시 코드는 mm/filemap.c 에 있다.

버퍼 캐시는 mm/buffer.c 에 , 스왑캐시는 mm/swap_state.c 와 mm/swapfile.c 에 구현되어있다.

2-3 커널

상대적으로 일반적인 코드는 kernel 에 있고, 아키텍쳐 종속적인 코드는 arch/*/kernel 에 있다.

스케쥴러는 kernel/sched.c 에 있고, fork 코드는 kernel/fork.c 에 있다.

하반 부 핸들러 코드는 Include/linux/interrupt.h 에 있다. task struct 자료 구조는 include/linux/sched.h 에서 찾을 수 있다.

2-4 PCI

PCI 유사 드라이버는 drivers/pci/pci.c에 있고, 시스템 범위의 정의들은 include/- linux/pci.h에 되어 있다. 각 아키텍쳐들은 특정 PCI BIOS 코드를 가지고 있는데, 알파의 PCI BIOS 코드는 arch/alpha/kernel/bios32.c에 있다.

2-5 프로세스간 통신

이것은 모두 ipc에 들어 있다. 모든 시스템 V IPC 오브젝트들은 ipc_perm 자료구조에 들 어 있고, include/linux/ipc.h에서 찾을 수 있다. 시스템 V 메시지들은 ipc/msg.c에, 공유 메모리는 ipc/shm.c에, 세마포어는 ipc/sem.c에 구현되어 있다. 파이프는 ipc/pipe.c에 구현되어 있다.

2-6 인터럽트 처리

커널의 인터럽트 처리 코드는 대부분 모두 마이크로프로세서 (때때로 플랫폼) 종속적이다. 인텔의 인터럽트 처리 코드는 arch/i386/kernel/irq.c에 있고, 정의는 include/asm- i386/irq.h에 되어 있다.

2-7 디바이스 드라이버

리눅스 커널 소스 코드의 대부분은 디바이스 드라이버에 있다. 모든 리눅스 디바이스 드라 이버 소스는 drivers에 있지만, 이들은 장치 유형에 따라 세분화 된다.

/block 블럭 디바이스 드라이버. 예를 들어 IDE 디바이스 드라이버는 ide.c에 있다.

모든 장치가 어떻게 파일 시스템을 가질 수 있으며, 어떻게 초기화되는지 보고 싶다면 drivers/block/genhd.c에 있는 device_setup()을 보기 바란다. 이는 하드 디스크만 초기화하는 것이 아니라, 네트웍을 nfs 파일 시스템에 마운트하려고 한다면 네트웍도 초기 화한다.

블럭 장치에는 IDE와 SCSI 기반 장치가 포함된다. /char ttys, 시리얼 포트나 마우스같은 문자 기반 장치들을 볼 수 있다.

/cdrom 리눅스의 모든 CDROM 코드가 들어 있다. 특별한 CDROM 장치(Soundblaster CDROM 같은)도 여기서 찾을 수 있다. IDE CDROM 드라이버는 drivers/block에 있는 ide-cd.c에 있고, SCSI CDROM 드라이버는 drivers/scsi에 있는 scsi.c에 있다는 점 에 주의하기 바란다.

/pci 여기에는 PCI 유사 드라이버의 소스가 있다. PCI 서브시스템이 어떻게 매핑되고 초기화 되는지 보기 좋은 곳이다. 알파 AXP PCI 확정 코드는 arch/alpha/kernel/bios32.c에 있고, 이는 볼만한 가치가 있다.

/scsi 모든 SCSI 코드와 함께 리눅스가 지원하는 모든 SCSI 장치들의 드라이버가 있는 곳이 다.
/net 네트웍 장치 디바이스 드라이버를 볼 수 있는 곳이다. DECChip 21040 PCI 이더넷 드라 이버는 tulip.c에 있다.
/sound 모든 사운드 카드 드라이버가 있는 곳이다.

 

2-8 파일 시스템

EXT2 파일 시스템 소스는 fs/ext2/ 디렉토리에 있고 자료구조는 include/linux/- ext2_fs.h, ext2_fs_i.h, ext2_fs_sb.h에 정의되어 있다. 가상 파일 시스템 자료구조 는 include/linux/fs.h에 정의되어 있고, 코드는 fs/*에 있다. 버퍼 캐시와 update 커널 데몬은 fs/buffer.c에 구현되어 있다.

 

2-9 네트워크

네트워킹 코드는 net에 있고, 인클루드(include) 파일들의 대부분은 include/net에 있다. BSD 소켓 코드는 net/socket.c에 있고, IP 버전 4 INET 소켓 코드는 inet/ipv4/- af_inet.c에 있다. 일반적인 프로토콜 지원 코드는 (sk_buff 처리 루틴도 포함하여) net/core/에, TCP/IP 네트워킹 코드는 net/ipv4/에 있다. 네트워크 디바이스 드라이버는 drivers/net에 있다.

 

2-10 모듈

커널 모듈 코드는 일부분은 커널에, 일부분은 modules 패키지에 있다. 커널 코드는 모두 kernel/modules.c에 있고, 자료구조와 커널 데몬 kerneld 메시지는 include/- linux/module.h와 include/linux/kerneld.h에 있다. ELF 오브젝트 파일의 구조는 include/linux/elf.h에서 볼 수 있다.

 

반응형