상세 컨텐츠

본문 제목

리눅스 커널 컴파일

Computer Science/OS

by Yongari 2023. 1. 1. 09:24

본문

 

 

리눅스 커널 컴파일은 왜, 무엇을 하는 것일까?

 

윈도우의 경우에는 OS버전이 나올때마다 새로 설치해서 업데잍트해야한다. 그렇다면 리눅스는 어떻게할까?

리눅스는 그저 새로운 커널을 컴파일하고, 컴파일 된 커널로 재부팅하면 그만이다. 

 

리눅스 커널컴파일 단계는 다음과 같이 3단계다.

 

1. 커널 구성(Kernel configuration)

2. 커널 컴파일(Kernel compile)

3. 커널 인스톨(Kernel installation)

 

커널 구성(Kernel configuration)이란 새로 만들어질 리눅스 커널에게 현재 시스템에 존재하는 하드웨어 특성, 커널 구성요소, 네트워크 특성 등의 정보를 알려주는 과정이다. 이 과정은 시스템 하드웨어 정보들에 대한 사전 지식이 필요하다. 커널 구성을 수행하는 방법은 

make config

make menuconfig

make xconfig 등의 방법이있다.

커널 구성단계에서 사용자가 선택한 사항은 include/linux/autoconf.h와 .config라는 파일에 저장되며, 이후 커널 컴파일 단계에서 사용하게 된다.

 

그다음 단계는 커널 컴파일이다.  이 단계는 커널 소스 파일을 이용해 실행 가능한 커널을 만드는 과정으로 "make bzImage"나 "make zImage"등의 명령으로 생성될 수 있다. (bzImage나 zImage나 이미지 크기만 차이가 있고 커널 자체는 동일하다.)

커널 버전 2.6 이후부터는 단순히 "make"만을 타이핑해도 된다. 커널 컴파일이 끝나면 i386 CPU 기준으로 했을 때

kernel/arch/x86/boot/ 디렉터리에 생성된다.

 

그 다음 단계는 커널 인스톨을 수행해야한다. 커널 인스톨은 생성된 커널로 시스템이 부팅될 수 있도록 만드는 과정이다. 구체적으로 커널 인스톨은 생성된 커널 이미지를 루트파일시스템으로 복사, 모듈 인스톨, 그리고 부트 로더(예를 들면 grub )수정 등의 과정으로 이루어진다. 

 

 

커널 컴파일 단계는 다음 코드를 참고하면 된다.

/* /usr/src 디렉토리에 커널 소스를 받은 뒤 압축 해제한다. */
cd /usr/src/kernels/linux-3.16/

/* 커널 구성 */
make menuconfig

/* 커널 컴파일 */
make

/* 모듈로 선택한 커널 구성 요소를 컴파일 및 인스톨 */
make modules
make modules_install

/* 커널 인스톨 */
make install

 

커널 내에 생성되는 각 파일들의 관계와 단계

1단계 : 커널소스들을 컴파일하여 .o파일(오브젝트 파일), .a파일(라이브러리 파일)을 생성한다. 

2단계 : 1단계의 컴파일된 소스들을 링킹하여(ld사용) vmlinux 파일을 생성한다.

3단계 : nm 명령어를 통해 linux/vmlinux 파일 내용을 다음 linux/System.map 파일로 만들어준다. 

(nm은 오브젝트 파일에서 심볼을 추줄해 주는 프로그램이다. 커널 이미지 파일에서 모든 심볼을 추출해내고 이 중에 필요한 부분만을 추려 System.map을 만든다)
    - vmlinux 파일 (커널 소스의 최상위 디렉토리에 만들어짐, 압축되지 않은 elf 포맷의 파일의 커널 이미지) 
    -
System.map 파일 (symbol들의 메모리 위치 맴을 보여준다. (디버깅, 포렌식에 사용된다) ,
리눅스 커널 이미지는 다시 0xc0000000에 다시 매핑된다.) 

다음과 같이 실행된다고 보면 된다. (출처 : https://wiki.kldp.org/KoreanDoc/html/EmbeddedKernel-KLDP/detail-analysis-of-each-stage.html)

nm vmlinux | grep -v '\(compiled\)\|\(\.o$\)\|\( [aUw] \)\|\(\.\.ng$\)\|\(LASH[RL]DI\)' | sort > System.map

4단계 : "obj copy" 명령어를 이용해서 .note와 .comment 섹션을 삭제하고 재배치(relocation) 정보와 심볼 정보를 삭제한 뒤 바이너리 포맷의 파일을 출력한다.

5단계 : 이를 gzip 압축 알고리즘을 이용해서 piggy.gz를 생성한다.

6단계 : 여기서 디버깅 정보등을 삭제하여 piggy.o를 생성한다.

7단계 : 다음으로 커널의 압축을 해제시켜주는 코드(head.s, misc.c)를 커널 앞부분에 덧붙여서 링커를 통해 bvmlinux나 vmlinux파일을 생성한다. 이 파일들이 바로 bzImage와 zImage파일이 되는 것이다. 

 

 

 

출처 : 리눅스 커널 내부구조

 

 

 

관련글 더보기