임베디드기사 실기 20부작 7편
module_init(), register_chrdev(), request_region으로 이해하는 Kernel Module 초기화
앞선 연재에서는 Linux Device Driver가 사용자 프로그램과 하드웨어 사이에서 어떤 역할을 하는지 살펴보았습니다. 이번에는 그 Driver가 실제로 Kernel 안에 들어갈 때 어떤 순서로 준비되고, 어떤 자원을 확보하며, 종료할 때 어떻게 정리되는지를 하나의 흐름으로 묶어 보겠습니다.
임베디드기사 실기에서는 함수 이름 하나만 외우는 것보다 ‘모듈 로드 → Driver 등록 → 자원 확보 → 사용 → 해제’ 흐름을 이해하는 것이 훨씬 중요합니다.
Linux Kernel은 모든 기능을 하나의 거대한 실행 이미지에만 넣는 방식이 아니라, 필요에 따라 기능을 추가하거나 제거할 수 있도록 Kernel Module 구조를 제공합니다. Device Driver도 자주 Module 형태로 작성되며 일반적으로 .ko 파일로 빌드됩니다.
Module을 insmod 또는 modprobe로 로드하면 Kernel은 해당 Module의 초기화 함수를 실행합니다. 통합 학습자료에서는 이 초기화 함수를 과거 표현인 init_module() 또는 현대적인 module_init(fn) 매크로로 등록된 함수로 설명하고 있습니다.
module_init()는 Driver 자체를 직접 등록하는 함수라기보다, Kernel Module이 로드될 때 실행할 초기화 함수가 무엇인지 Kernel에 알려주는 매크로로 이해하면 좋습니다.
예를 들어 초기화 함수 내부에서 다음과 같은 작업을 수행할 수 있습니다.
① Character Device Driver 등록
② I/O Port 또는 Memory Resource 확보
③ Interrupt 등록
④ 내부 Buffer 또는 Memory 할당
⑤ Hardware Register 초기화
따라서 시험에서 “register_chrdev()와 request_region()을 수행하는 초기화 함수는?”과 같은 형태가 나오면 핵심 답은 module_init()으로 등록된 초기화 함수라는 점을 기억해야 합니다.
register_chrdev()는 Character Device Driver를 Kernel에 등록할 때 사용하는 대표적인 함수입니다. 학습자료에서는 이 함수가 Major Number와 file_operations 구조체를 Kernel에 연결하는 역할로 정리되어 있습니다.
여기서 Major Number는 “어떤 Driver인가”를 구분하는 번호이고, 사용자 공간에서는 이 Major Number와 연결된 Device Node를 통해 Driver에 접근합니다.
핵심 연결 관계register_chrdev() → Kernel에 Driver 등록mknod → /dev 아래 Device Node 생성open()/read()/write()/ioctl() → User Application에서 Driver 기능 사용
하드웨어 Driver는 종종 특정 I/O Port 또는 Memory-Mapped I/O 영역을 사용합니다. 그런데 두 개의 Driver가 같은 Hardware Resource를 동시에 사용하면 충돌이 발생할 수 있습니다.
request_region()은 이러한 I/O 영역을 Driver가 사용하겠다고 Kernel에 등록·예약하는 역할로 정리되어 있습니다. 반대로 Module이 제거될 때에는 release_region()으로 자원을 반환합니다.
통합 학습자료에서는 과거의 check_region()은 현재 deprecated된 것으로 설명하고 있으며, 시험에서는 request_region()과 release_region()의 짝을 기억하는 것이 중요합니다.
이 흐름에서 가장 중요한 원칙은 초기화하면서 확보한 자원은 종료할 때 반드시 역순으로 해제한다는 것입니다.
Module을 제거할 때는 초기화 때 등록하고 확보한 자원을 정리해야 합니다. 학습자료에서는 과거의 cleanup_module() 또는 module_exit(fn)으로 지정한 종료 함수가 호출되는 흐름으로 설명합니다.
대표적인 해제 작업은 다음과 같습니다.
• unregister_chrdev() — Character Driver 등록 해제
• release_region() — I/O Resource 반환
• Interrupt 해제
• 동적 Memory 해제
• Hardware를 안전한 상태로 복귀
Driver 개발에서 초기화 코드만큼 종료 코드가 중요한 이유는, 자원을 반환하지 않으면 다음 로드 시 충돌하거나 시스템이 불안정해질 수 있기 때문입니다.
| 등록/확보 | 해제 | 의미 |
|---|---|---|
| register_chrdev() | unregister_chrdev() | Character Driver 등록/해제 |
| request_region() | release_region() | I/O Resource 확보/반환 |
| module_init() | module_exit() | Module 진입/종료 함수 지정 |
문제
Linux Kernel Module에서 Character Device를 등록하고 I/O 영역을 확보하는 초기화 함수가 Module Load 시 호출되도록 지정하는 매크로를 쓰시오.
모범답안module_init()
3문장 해설module_init()은 Kernel Module이 Load될 때 실행할 초기화 함수를 지정한다. 이 초기화 함수 내부에서 register_chrdev(), request_region() 등의 등록 및 자원 확보 작업을 수행할 수 있다. Module 제거 시에는 module_exit()으로 지정한 종료 함수에서 자원을 해제한다.
문제request_region()과 release_region()의 역할을 각각 설명하시오.
모범답안request_region()은 Driver가 사용할 I/O 영역을 Kernel에 등록·예약하여 Resource 충돌을 방지한다. release_region()은 Module 종료 시 해당 영역을 반환한다.
문제
Kernel Module의 초기화 시 등록한 Character Device와 I/O Resource를 Module 제거 시 어떻게 처리해야 하는지 쓰시오.
모범답안unregister_chrdev()로 Character Device 등록을 해제하고 release_region()으로 I/O Resource를 반환해야 한다.
실제 Driver 개발에서는 “등록 성공 여부”를 단계별로 확인하는 습관이 중요합니다. 예를 들어 Driver 등록에는 성공했지만 Resource 확보에 실패했다면, 이미 등록한 Driver를 다시 해제하고 오류를 반환해야 합니다.
이러한 구조를 이해하면 실기 문제뿐 아니라 현장에서 “Module은 올라왔는데 Device가 열리지 않는다”, “두 Driver가 같은 Address를 사용한다”, “rmmod 후 다시 insmod 했더니 Resource Busy가 발생한다”와 같은 문제를 추적하는 데에도 도움이 됩니다.
module_init = 초기화 함수 지정
register_chrdev = Character Driver 등록
request_region = I/O 자원 확보
module_exit = 종료 함수 지정
unregister_chrdev = Driver 등록 해제
release_region = I/O 자원 반환
한 문장 암기:
“Module이 올라오면 등록하고 확보하고, 내려갈 때는 해제하고 반환한다.”
Kernel Module을 이해할 때는 개별 API를 따로 외우지 말고 생명주기 전체를 보는 것이 좋습니다. Module이 Load되면 초기화 함수가 실행되고, Driver와 Hardware Resource를 등록·확보합니다. Module이 제거될 때는 반대로 모든 자원을 정리해야 합니다. 이 구조는 Linux Device Driver 문제 전반을 이해하는 뼈대가 됩니다.
8편 — mknod와 Major/Minor Number, /dev Device Node 완전 이해
다음 편에서는 Kernel에 등록된 Driver가 사용자 프로그램과 실제로 어떻게 연결되는지, mknod, Major Number, Minor Number, Character/Block Device를 중심으로 자세히 살펴보겠습니다.
태그
#임베디드기사 #임베디드기사실기 #임베디드실기 #리눅스커널 #커널모듈 #DeviceDriver #디바이스드라이버 #module_init #module_exit #register_chrdev #unregister_chrdev #request_region #release_region #LinuxDriver #KernelModule #임베디드리눅스 #자격증공부 #실기시험 #리눅스프로그래밍 #임베디드시스템