임베디드 스터디 - 리눅스 커널 모듈
임베디드 스터디 - 리눅스 커널 모듈
커널 모듈
- 커널을 시스템 재부팅 없이 기능을 추가하거나 제거할 수 있음
- 커널 개발의 시간 단축시킬 수 있는 유용한 기능
- 단, 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 modulermmod: Remove modulelsmod: List modulemodprobe: 의존성 포함 커널 모듈 추가/제거
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 라이센스를 따릅니다.