포스트

임베디드 스터디 - 커널 구성 (Configuration)

임베디드 스터디 - 커널 구성 (Configuration)

커널 구성 개요

  • 리눅스 커널은 수백 개의 드라이버와 기능을 지원하지만, 모든 기능을 항상 포함할 수는 없음
    • 커널 이미지가 지나치게 커지면 임베디드 시스템의 Flash/RAM 용량을 초과할 수 있음
    • 반대로 꼭 필요한 드라이버가 빠지면 부팅 자체가 불가능할 수 있음
  • 이를 해결하기 위해 Kconfig 시스템으로 포함할 기능을 선택적으로 구성함

Kconfig 언어

  • 각 서브디렉토리에 위치한 Kconfig 파일이 menuconfig에 표시될 설정 항목을 정의함
config SERIAL_PL011
    tristate "ARM AMBA PL011 serial port support"
    depends on ARM_AMBA
    default y
    help
        This selects the ARM(R) AMBA(R) PrimeCell PL011
        UART. If unsure, say Y.

주요 키워드

키워드역할
tristateY(빌트인) / M(모듈) / N(제외) 세 가지 선택 가능
boolY(포함) / N(제외) 두 가지만 선택 가능
depends on의존성 선언 — 조건 미충족 시 menuconfig에서 비활성화
defaultdefconfig 없이 처음 빌드할 때 적용되는 기본값
helpmenuconfig에서 ? 키 입력 시 표시되는 설명
  • tristate vs bool 선택 기준
    • tristate : 모듈로 분리 가능한 드라이버 (UART, USB, 네트워크 드라이버 등)
    • bool : 모듈로 분리할 수 없는 핵심 기능 (예: CONFIG_SMP 멀티코어 지원)
  • depends on 동작 예시
config SERIAL_PL011
    depends on ARM_AMBA
# ARM_AMBA=n 이면 SERIAL_PL011 항목 자체가 menuconfig에서 비활성화됨

make menuconfig

  • Kconfig 파일들을 읽어 TUI(텍스트 UI) 형태로 설정 항목을 표시함
  • 개발자가 각 항목에 Y / M / N 을 선택하면 결과가 .config 파일에 저장됨
1
2
3
4
5
6
7
8
9
10
make menuconfig 화면 예시

  [ ] Enable loadable module support
  [*] Networking support
  Device Drivers --->
      Character devices --->
          Serial drivers --->
              <*> ARM AMBA PL011 serial port support   ← * : =y (빌트인)
              <M> USB Serial Converter support          ← M : =m (모듈)
              < > Modem Support                         ← 공백 : =n (제외)

.config 파일

  • menuconfig 선택 결과가 저장되는 파일
  • Kbuild가 빌드 시 .config를 읽어 obj-y / obj-m 을 결정함
1
2
3
4
# .config 내용 예시
CONFIG_SERIAL_PL011=y         # 빌트인 → obj-y
CONFIG_USB_SERIAL=m           # 모듈   → obj-m
# CONFIG_INFINIBAND is not set  # 제외

빌트인(=y) vs 모듈(=m)

  • 빌트인과 모듈의 가장 큰 차이는 로드 시점
 =y 빌트인=m 모듈
위치커널 이미지 내부/lib/modules/*.ko
로드 시점부팅 시 자동필요 시 insmod / modprobe
장점부팅 초기부터 사용 가능커널 이미지 크기 절약
단점커널 이미지 비대화파일시스템 마운트 후에만 로드 가능

선택 기준

1
2
3
부팅 초기에 반드시 필요한가?
├── YES → =y  (루트 파일시스템 드라이버, 핵심 버스 드라이버)
└── NO  → =m  (선택적 주변장치, 나중에 필요할 수도 있는 드라이버)
  • 스토리지 드라이버를 =m으로 빌드하면 닭-달걀 문제 발생
    • 모듈(.ko)은 파일시스템(/lib/modules/)에 저장됨
    • 그런데 파일시스템을 마운트하려면 스토리지 드라이버가 필요함
    • → 스토리지 드라이버는 반드시 =y로 빌트인해야 함

전체 구성 흐름

1
2
3
4
5
6
7
8
9
10
각 디렉토리의 Kconfig 파일이 설정 항목을 정의
        ↓
make menuconfig 로 TUI에서 Y/M/N 선택
        ↓
선택 결과가 .config 파일에 저장
        ↓
Kbuild가 .config를 읽어 obj-y / obj-m 결정
        ↓
=y → 커널 이미지에 정적 포함
=m → .ko 파일로 빌드 → /lib/modules/ 에 설치
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.