리눅스 커널 구조와 빌딩 시스템
리눅스 커널 구조와 빌딩 시스템
리눅스는 다양한 서브 시스템이 모여 동작하는 모노리딕 커널이다.
1. 리눅스 커널 구조
리눅스 커널은 유저 프로그램과 하드웨어 장치 사이에서 작동하며 서브 시스템으로는 아키텍처 의존적인 코드, 디바이스 드라이버, 프로세스 관리, 메모리 관리, 가상 파일 시스템, 네트워크 서브 시스템, 시스템 콜 인터페이스로 구성되어 있는데 그 역할은 다음과 같다.
■ 아키텍처 의존적인 코드
리눅스는 아키텍처의 종류에 관계없이 동일한 기능을 제공하지만 아키텍처 마다 그 밑에서 제어가 필요한 부분이 존재하며 CPU, MMU 드라이버가 그 역할을 한다. 이것들의 코드는 arch 디렉토리에 존재한다.
■ 디바이스 드라이버
리눅스는 모니터, 블루투스, 와이파이 등과 다양한 방식으로 통신을 하는데 이것들을 위한 코드를 디바이스 드라이버라고 하며 drivers 디렉토리에 존재한다. (커널의 코드 반 이상이 디바이스 드라이버 코드이다.)
■ 프로세스 관리
CPU는 프로세스에게 자신의 자원을 분배하는데 여러개가 자원을 요구할 때는 균등하게 분배를 해야하며 그것들의 생성과 전이 과정을 관리해야 한다. 프로세스 관리가 이 역할을 하며 kernel 디렉토리에 존재한다.
■ 메모리 관리
이 서브 시스템은 메모리의 항당, 해제, 공유 등을 관리하며 mm 디렉토리에 코드가 존재한다.
■ 가상파일 시스템
여러 종류의 파일 시스템을 추상화 하여 공통의 인터페이스를 제공한다.
■ 네트워크 서브 시스템
네트워크 장치를 추상화 하여 제공한다. 이 때문에 종류가 다양한 네트워크 장치를 인관된 방법으로 사용할 수 있다.
■ 시스템 콜 인테페이스
유저의 공간에서 커널에 있는 기능을 불러올 수 있도록 인터페이스 제공.
2. 커널 빌딩 시스템
앞에서 정리한 것처럼 리눅스는 여러개의 서브 시스템으로 이루어져 있으며... 이렇게 복잡한 녀석도 빌딩(building)을 통해서 부팅이 가능한 바이너리 파일인 zImage로 만들어지는데 [리눅스 커널 = zImage] 인 것이다.
zImage는 커널의 [초기화 > 설정 > 빌딩 > 설치]의 과정으로 만들어지는데 각각의 과정에 대해서 알아본다.
■ 초기화
우리는 리눅스 커널 압축 파일을 kernel.org 등을 통해서 쉽게 받을수 있다. 이렇게 받은 녀석을 압축해제하면 커널의 초기상태가 된다. 그리고 커널은 make proper와 make distclean 명령어를 이용해서 언제든지 초기 상태로 되돌릴 수 있다.
mrproper는 컴파일 등을 위해서 생성된 파일을 삭제하며 distclean은 mrproper 실행 후에 추가로 생성된 오브젝트 파일, 백업 파일 등을 삭제한다.
■ 설정
커널을 초기화 했다면 다음으로는 이 커널을 사용할 시스템에 맞는 커널의 요소들을 알맞게 선택해줘야 한다. 그렇지 않고 바로 컴파일 하면 컴파일은 진행되겠지만 부팅 할 때 커널 패닉(kernel panic)을 일으키게 된다.
커널을 설정하는 과정은 꽤 복잡한 과정인데 arch/$(ARCH)/configs 폴더에는 각 시스템에 맞게 이미 설정되어 있는 파일들을 제공하니 참고하자.
■ 빌딩
이 과정은 설정 과정을 통해 생성된 .config 파일을 생성한 후에 진행하며 컴파일과 링킹을 통해서 단인 부팅 파일인 zImgae를 생성하는 과정을 말한다.
■ 설치
빌딩 과정을 거쳐서 zImage가 만들어지면 설치 과정을 통해서 커널을 적절한 곳에 위치시켜야 한다.