본문 바로가기
Linux System/Linux Kernel

Kernel Build

by rewyear 2022. 3. 3.

Kernel Configuration

Kernel Config

커널을 빌드하기 전에 각 시스템에 맞게 설정을 해주어야 하는데 "CONFIG_"라는 prefix로 시작되는 설정 옵션을 조정함으로서 가능하다. 예를 들어 FrameBuffer에 대한 feature를 활성화해주기 위해서는 CONFIG_FB를 enable 시키면 된다.

 

이 설정 옵션은 두 가지 형태의 값을 갖는데 Boolean과 Tri-state의 형태로 값을 갖는다.

Boolean 타입의 경우 커널 빌드 시 해당 feature를 활성화할 것인지(yes), 비활성화(no)할 것인지를 설정하게 되고,

Tri-State의 경우 Boolean 타입에서 module이라는 값이 추가된 타입인데 module로 설정하여 빌드 시, 해당 feature 모듈을 커널에 Built-in 형태로 빌드하는 것이 아닌 동적으로 로딩할 수 있도록 모듈형태로 빌드한다.

  • Boolean: yes / no
  • Tri-State: yes / no / module

이러한 설정 기능들을 이용하여 배포되고 있는 커널에서 자신의 시스템에 맞게 설정을 하여 시스템을 구축해야 된다.

커널은 이를 위한 여러가지 Tool을 제공하는데 그 중 GUI 기반의 설정 툴인 menuconfig가 자주 사용된다.

make menuconfig

menuconfig를 이용하게 되면 GUI기반으로 Kernel Config를 설정할 수 있다. 해당 menuconfig의 내용을 구상하기 위해 Kconfig를 구성해 주어야 함

 

defconfig

Default Configuration으로서 해당 타겟보드에 대한 기본 설정을 미리 정의해둔 파일

arch/arm(or arm64)/configs/<target>_defconfig와 같은 위치/파일명으로 정의되어 있음.

 

.config

최종적으로 실제 커널 빌드 시 사용될 설정들이 기재되어있는 파일로 defconfig 기반 + menuconfig를 통해 user가 추가로 설정한 내용을 반영하여 구성

 

autoconf.h

.config파일을 기반으로 실제 소스코드 상에서 사용할 수 있도록 설정에 대한 define을 정의한 파일

대개 include/generated.autoconf.h에 위치

 

Kernel Build command

make mrproper

커널 소스 config 초기화하는 명령으로서, 이전 빌드 시 설정되어있던 config를 제거

make mrproper

 

 

make config

config를 설정하기 위한 가장 기본적인 명령어로 설정 여부를 확인하면서 config에 대해서 y/n/m를 설정해 주어야 함.

가장 상위 디렉토리부터 하위 디렉토리까지 하나씩 설정해줘야하는 번거로움이 존재.

make menuconfig

 menuconfig란 GUI 기반의 설정 툴로 make config처럼 가장 상위 디렉토리부터 설정을 진행하는 것과는 달리 필요한 설정으로 이동하여 필요한 config만 설정할 수 있음.

make menuconfig​

make oldconfig

make config 명령을 통해 설정된 config 또는 기존 config를 복사해와 .config형태로 저장 후, 해당 .config내용을 적용시켜주는 역할.

make menuconfig의 경우 make config + make oldconfig까지 수행

 

Kernel Build 과정

configure 설정이 완료되면 실제로 커널을 빌드하는데, 여기서 "커널을 빌드한다"는 것은

1) 커널 소스를 compile하고

2) 생성된 .o(오브젝트 파일)을 link하여 vmlinux라는 파일을 생성하고

3) 이를 또 압축하여 zImage를 만드는 과정을 의미함.

 

vmlinux

커널 컴파일 후 가장 먼저 생성되는 ELF(Executable Linking Format) file 파일로서, 커널 object 파일들을 정적으로 링크한 바이너리 실행파일 이외에도 심볼 테이블, comment, reloacation 정보, 디버깅 정보 및 타겟 아키텍처를 위한 요소들이 포함되어 있음.

커널 소스 최상위 디렉토리에 위치

 

Image

vmlinux로 부터 objcopy 명령을 통해 볼과 기타 정보들을 제거하고 순수 binary kernel module만 존재하는 파일.

이후 해당 Image를 piggy.gzip 형태로 압축 후, piggy.gzip.S에 포함하여 assembling하면 piggy.gzip.o이 생성된다.

이후 piggy.gzip.o에 압축을 해제하기 위한 misc.o와, 커널 초기화를 위한 head.o를 링킹하여 새로 vmlinux라는 파일 생성

 

해당 링킹 과정에서 심볼 테이블, comment, reloacation 정보이 추가되었으므로 다시 objcopy를 통해 제거하면 최종적으로 zImage 파일이 만들어 짐.

 

arm64(aarch64) 커널에서는 상기 설명과 같이 압축된 커널을 해제하는 루틴이 포함되어 있지 않아 Image 파일을 그대로 사용하거나 압축된 Image.gz 사용하기 위해서는 부트로더에서 압축된 커널을 decompress하는 기능이 필요함

 

uImage

U-boot에서 kernel 부팅시키기 위해 사용되는 이미지로서 zImage파일에 64byte 헤더를 추가시킨 형태

64byte 헤더에는 target architecture, operating system, image type, compression method, entry point, time stamp, CRC32 checksums 등과 같은 정보들이 있음

 

u-boot 빌드 생성되는 mkimage tool 활용하여 생성할 있음

mkimage -A <arch> -O <os> -T <type> -C <comp> -a <load_addr> -e <entry_addr> -n <name> -d <data_file> <image>
300x250

'Linux System > Linux Kernel' 카테고리의 다른 글

[Kernel] Timer  (0) 2023.02.11
runtime에 target board kernel의 config 확인  (0) 2022.09.14
User Space와 Kernel Space  (0) 2022.08.17
Device Driver - Atomic  (0) 2022.05.23
Kernel Source Tree  (0) 2022.03.03