커널 포팅 (2. 커널 소스 분석 및 빌드 / 2.2 커널 빌드 과정 이해)

2025. 3. 6. 19:35프로그래밍/시스템

2.2 커널 빌드 과정 이해

리눅스 커널 빌드는 소스 코드를 컴파일하여 실행 가능한 커널 이미지를 생성하는 과정입니다.
커널을 빌드하기 위해서는 설정(configuration), 컴파일, 이미지 생성, 모듈 빌드, 디바이스 트리 빌드 등의 과정이 필요합니다.


🔹 커널 빌드 기본 과정

리눅스 커널을 빌드하려면, 먼저 빌드할 아키텍처(ARM, x86, RISC-V 등)를 선택하고, 설정을 조정한 후 컴파일해야 합니다.

📌 커널 빌드의 핵심 과정:

# 1. 커널 기본 설정 (menuconfig 사용)
make ARCH=arm menuconfig

# 2. 커널 이미지 빌드 (zImage 또는 bzImage)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage -j$(nproc)

# 3. 디바이스 트리 빌드 (dtb 파일 생성)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs

# 4. 커널 모듈 빌드 (외부 드라이버 지원 시 필요)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules

# 5. 빌드된 모듈 설치
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_install INSTALL_MOD_PATH=output/

📌 1️⃣ 커널 설정 (make menuconfig)

커널을 빌드하기 전에 사용할 기능, 드라이버, 파일 시스템, 네트워크 옵션 등을 설정해야 합니다.

설정 명령어

make ARCH=arm menuconfig
  • 터미널에서 GUI 기반의 설정 창이 열리며, 필요한 기능을 활성화하거나 비활성화할 수 있음
  • .config 파일에 설정이 저장됨

설정 UI 예시

 ┌──────────────────────── Linux Kernel Configuration ────────────────────────┐
 │  Arrow keys navigate the menu. <Enter> selects submenus --->.              │
 │  Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes,     │
 │  <M> modularizes features. Press <Esc><Esc> to exit, <?> for help, </>     │
 │  to search. Legend: [*] built-in  [ ] excluded  <M> module  < > empty.    │
 │ ┌─────────────────────────────────────────────────────────────────────────┐ │
 │ │  Processor type and features  --->                                      │ │
 │ │  Power management and ACPI options  --->                               │ │
 │ │  General setup  --->                                                   │ │
 │ │  Enable loadable module support  --->                                  │ │
 │ │  Device Drivers  --->                                                  │ │
 │ │  File systems  --->                                                    │ │
 │ └─────────────────────────────────────────────────────────────────────────┘ │
 └───────────────────────────────────────────────────────────────────────────┘

설정 완료 후 저장

  • 설정이 완료되면 .config 파일에 저장됨
  • .config 파일은 커널 빌드 시 참고됨

💡 자동 설정 파일 사용 (defconfig)

  • 특정 보드나 플랫폼의 기본 설정을 적용하려면 defconfig를 사용할 수 있음
make ARCH=arm rpi_defconfig   # 라즈베리파이 기본 설정 로드
  • arch/arm/configs/ 경로에서 지원하는 defconfig 목록을 확인 가능

📌 2️⃣ 커널 빌드 (make zImage)

커널 소스를 설정한 후, 실제 실행 가능한 커널 이미지를 빌드해야 합니다.

커널 이미지 빌드

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage -j$(nproc)
  • zImage: ARM 아키텍처에서 사용하는 압축된 커널 이미지
  • bzImage: x86 아키텍처에서 사용하는 부팅 가능한 커널 이미지
  • -j$(nproc): CPU 코어 개수만큼 병렬 빌드를 수행하여 속도를 향상

빌드가 완료되면 커널 이미지 확인

ls arch/arm/boot/
zImage  dts/
  • zImage 파일이 생성됨 (ARM의 경우)
  • x86에서는 arch/x86/boot/bzImage가 생성됨

📌 3️⃣ 디바이스 트리 빌드 (make dtbs)

임베디드 시스템에서는 디바이스 트리(Device Tree) 를 사용하여 하드웨어 정보를 커널에 전달함.

디바이스 트리 빌드

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs
  • dtb(Device Tree Blob) 파일이 생성됨
  • 생성된 파일 확인:
ls arch/arm/boot/dts/
  • 예: bcm2711-rpi-4-b.dtb (라즈베리파이 4)

디바이스 트리 적용

  • 부트로더(U-Boot)에서 디바이스 트리를 함께 로드해야 함
bootz ${kernel_addr} - ${fdt_addr}

📌 4️⃣ 커널 모듈 빌드 (make modules)

일부 커널 드라이버는 모듈로 빌드할 수 있음 (CONFIG_MODULES=y 설정 필요).

모듈 빌드

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules

모듈 설치

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_install INSTALL_MOD_PATH=output/

모듈 확인

ls output/lib/modules/

💡 모듈 로드 및 제거

insmod mydriver.ko   # 모듈 로드
rmmod mydriver       # 모듈 제거

🔹 빌드를 위한 기본 옵션 설정 (defconfig, menuconfig)

기본 설정 적용 (defconfig)

make ARCH=arm rpi_defconfig
  • 특정 보드에 맞는 기본 설정 적용
  • arch/arm/configs/에서 사용 가능한 설정 파일 목록 확인 가능

설정을 직접 수정 (menuconfig)

make ARCH=arm menuconfig
  • 필요에 따라 기능을 활성화([*]), 모듈화(<M>), 비활성화([ ]) 가능

🔹 커널 빌드 시 사용하는 주요 스크립트 (Kconfig, Makefile)

📌 Kconfig (커널 설정 파일)

  • 커널 설정 메뉴(menuconfig)를 정의하는 파일
  • 각 서브 시스템(드라이버, 네트워크, 파일 시스템 등)에 대한 설정을 정의

예시 (drivers/Kconfig)

config MY_DRIVER
    tristate "Enable My Custom Driver"
    default n
    help
        This is a custom driver for my hardware.
  • tristate: y (빌트인), m (모듈), n (비활성화) 선택 가능
  • help: 해당 설정의 설명 제공

📌 Makefile (커널 빌드 스크립트)

  • 커널 빌드 과정에서 소스 파일을 컴파일하는 방법을 정의
  • arch/, drivers/, fs/ 등의 각 디렉토리에 Makefile 존재

예시 (drivers/Makefile)

obj-$(CONFIG_MY_DRIVER) += my_driver.o
  • CONFIG_MY_DRIVER=y → my_driver.o를 커널에 포함
  • CONFIG_MY_DRIVER=m → my_driver.ko 모듈로 빌드

✅ 정리

  1. 커널 설정: make menuconfig 또는 make defconfig
  2. 커널 이미지 빌드: make zImage (또는 bzImage)
  3. 디바이스 트리 빌드: make dtbs
  4. 모듈 빌드 및 설치: make modules && make modules_install
  5. 빌드 스크립트 (Kconfig, Makefile) 이해