reference:
- "리눅스 커널 내부구조" / 백승재, 최종무
- "Operating Systems: Three Easy Pieces" / Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau
/usr/src/linux 디렉터리에 리눅스(커널) 소스가 존재한다.
kernel 디렉터리: 태스크 관리자가 구현된 디렉터리. 태스크의 생성과 소멸, 프로그램의 실행, 스케줄링, 시그널 처리 등의 기능이 구현되어 있음. 한편 문맥 교환(context switch)과 같은 하드웨어 종속적인 태스크 관리부분은 arch/$(ARCH)/kernel 디렉터리에 구현.
$(ARCH)는 i386, arm 등의 CPU를 의미.
arch 디렉터리: 리눅스 커널 기능 중 하드웨어 종속적인 부분들이 구현된 디렉터리. CPU 타입에 따라 다시 하위 디렉터리로 구분됨.
예를 들어 pc 환경의 i386이라면,
arch/x86/boot: 시스템의 부팅 시 사용하는 부트스트랩 코드 구현.
arch/x86/kernel: 태스크 관리자 중 문맥 교환이나 쓰레드 관리 같은 기능 구현.
arch/x86/mm: 메모리 관리자 중 페이지 폴트 처리 같은 기능 구현.
이 밖에 여러 하드웨어 종속적인 부분이 구현되어 있음.
참고로 arch/x86/lib에는 커널이 사용하는 라이브러리 함수가 구현.
fs 디렉터리: 리눅스에서 지원하는 다양한 파일시스템과 open(), read(), write() 등의 시스템 콜이 구현된 디렉터리. 각 파일시스템은 디렉터리 하부 디렉터리에 들어가 있다(대표적으로 ext2/3/4, nfs, fat, proc, sysfs, devfs, isofs 등). 또한 다양한 파일시스템을 사용자가 일관된 인터페이스로 접근할 수 있도록 하기 위해 리눅스가 도입한 '가상 파일시스템(virtual file system)' 또한 이 디렉터리에 존재.
driver 디렉터리: 리눅스에서 지원하는 디바이스 드라이버가 구현된 디렉터리.
디바이스 드라이버(device driver): 디스크, 터미널, 네트워크 카드 등 주변 장치를 추상화시키고 관리하는 커널 구성 요소.
리눅스 초기 설계 시 크게 3가지 종류로 구분,
(1) 파일시스템을 통해 접근되는 블록 디바이스 드라이버,
(2) 사용자 수준 응용 프로그램이 장치파일을 통해 직접 접근하는 문자 디바이스 드라이버,
(3) TCP/IP를 통해 접근되는 네트워크 디바이스 드라이버.
(현재 이러한 구분은 충분치 못해 USB, LCD, DSP, Sound 등의 다양한 장치들이 사용됨.)
net 디렉터리: 리눅스가 지원하는 통신 프로토콜이 구현된 디렉터리. 대표적인 프로토콜인 TCP/IP 뿐 아니라 UNIX 도메인 통신 프로토콜을 비롯해 다양한 통신 프로토콜을 구현. 또한 다양한 통신 프로토콜의 추상화 계층이며 사용자 인터페이스를 제공하는 소켓(Socket) 역시 이 디렉터리에 구현되어 있음.
ipc 디렉터리: 리눅스 커널이 지원하는 프로세스간 통신 기능이 구현된 디렉터리. 대표적인 프로세스간 통신에는 파이프, 시그널, SYS V IPC, 소켓 등이 있는데, 이 디렉터리에는 message passing, shared memory, 세마포어가 구현.
파이프는 fs 디렉터리에, 시그널은 kernel 디렉터리에, 소켓은 net 디렉터리에 구현되어 있음.
init 디렉터리: 커널의 메인 시작 함수가 구현된 디렉터리. 하드웨어 종속적인 초기화가 이뤄지고 나면(arch/$(ARCH)/kernel 하위 head.S, mics.c) 이 디렉터리에 구현된 start_kernel()이라는 함수로 제어가 넘어오고, 이 함수가 커널 전역의 초기화를 수행.
include 디렉터리: 리눅스 커널이 사용하는 헤더 파일들이 구현된 디렉터리. 헤더 파일 중 하드웨어 독립적인 부분은 ./include/linux 하위 디렉터리에 정의. 하드웨어 종속적인 부분은 ./include/asm-$(ARCH) 디렉터리에 정의.
다른 여타 디렉터리들
- Documentation 디렉터리: 리눅스 커널 및 명령어들에 대한 자세한 문서 파일들 존재.
- lib: 커널 라이브러리 함수들이 구현됨.
- scripts 디렉터리: 커널 구성 및 컴파일 시 이용되는 스크립트들 존재.