포스트

임베디드 스터디 - 리눅스 커널 모듈

임베디드 스터디 - 리눅스 커널 모듈

커널 모듈

  • 커널을 시스템 재부팅 없이 기능을 추가하거나 제거할 수 있음
    • 커널 개발의 시간 단축시킬 수 있는 유용한 기능
    • 단, Safety-critical 환경에서는 사용하면 안됨
1
2
3
4
5
6
7
8
9
모듈 없이                        모듈 사용 시
─────────────────────────        ─────────────────────────
코드 수정                        코드 수정
    ↓                                ↓
커널 전체 재빌드 (수분)           모듈만 재빌드 (수초)
    ↓                                ↓
플래시에 굽기                    rmmod → insmod
    ↓
재부팅 (수십초~수분)

모듈의 구조

  • 일반 C 프로그램과 다르게 main()이 아닌, module_init()module_exit()이 실행됨
    • module_init()insmod 실행 시 동작
    • module_exit()rmmod 실행 시 동작
  • module_init()에서 kmalloc, 드라이버 테이블 및 Major number 획득
  • module_exit()에서 kfree, 드라이버 테이블 및 Major number 반납
1
2
3
4
5
6
7
8
9
10
11
static int __init my_driver_init(void) {
    // insmod 시 실행
    return 0;
}

static void __exit my_driver_exit(void) {
    // rmmod 시 실행
}

module_init(my_driver_init);
module_exit(my_driver_exit);

모듈 관리 명령어

  • insmod : Insert module
  • rmmod : Remove module
  • lsmod : List module
  • modprobe : 의존성 포함 커널 모듈 추가/제거
1
2
3
4
5
6
insmod usb_storage.ko
→ 의존 모듈(scsi_mod 등)이 없으면 그냥 실패

modprobe usb_storage
→ /lib/modules/의 의존성 DB(modules.dep) 확인
→ scsi_mod → sd_mod → usb_storage 순서로 자동 로드

커널 Makefile

  • 커널 모듈은 커널과 동일한 컴파일 환경에서 빌드되어야 함
    • 커널이 사용하는 자료구조 (struct device, struct file_operations 등)
    • 커널 헤더, 컴파일러 플래그, 심볼 테이블 모두 /lib/modules/.../build ```makefile obj-m += my_driver.o

all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

│ │

커널 Kbuild 시스템으로 진입 내 소스 위치 전달

```

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.