임베디드 스터디 - 커널 구성 (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.
주요 키워드
| 키워드 | 역할 |
|---|---|
tristate | Y(빌트인) / M(모듈) / N(제외) 세 가지 선택 가능 |
bool | Y(포함) / N(제외) 두 가지만 선택 가능 |
depends on | 의존성 선언 — 조건 미충족 시 menuconfig에서 비활성화 |
default | defconfig 없이 처음 빌드할 때 적용되는 기본값 |
help | menuconfig에서 ? 키 입력 시 표시되는 설명 |
tristatevsbool선택 기준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 라이센스를 따릅니다.