리눅스 디바이스 드라이버 기본 뼈대 구조 (모듈로 구현할때)
1. init / exit 함수
드라이버 로딩 시 초기화 (init)
드라이버 제거 시 자원 해제 (exit)
2. register_chrdev(), platform_driver_register() 등으로 디바이스를 커널에 등록
3. file_operations 구조체
유저 공간 → 커널 공간 인터페이스
open, read, write, unlocked_ioctl, release 등 시스템 콜과 연결
4. 모듈 매크로
module_init(init_func) → 드라이버 init 함수 등록
module_exit(exit_func) → 드라이버 exit 함수 등록
5. 모듈 정보
MODULE_LICENSE("GPL") → 커널에 라이선스 정보 전달
(GPL이 아니면 커널 내부 심볼 접근 제한)
선택적으로 MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_VERSION 등을 추가
문자디바이스,블록디바이스, 플랫폼디바이스, 등 디바이스 드라이버 공부 시작때 정리해놓았던 것 처음부터 다시 블로그에 정리하려한다.
module_init부터 initcall섹션 까지 따라가보기
커널이 모듈을 로드하면 .initcall*.init 섹션을 순회하면서 함수 포인터를 하나씩 실행
그중 .initcall6.init에 들어간 initModule 함수가 호출!
이렇게, 작성한 초기화 함수가 모듈 로딩 시 자동 실행된다.
1.module_init(initModule)

2. __initcall(initModule)
include/linux/module.h (_init, _exit)

include/linux/init.h

- __define_initcall(initModule,init)
)
- fn 함수 포인터를
- sectionc(__sec)라는 특정 섹션에 넣고 static으로 선언하며, __used 속성으로 컴파일러가 최적화하지 않도록 한다.
fn 함수 주소가 .initcallxxx같은 섹션에 기록되어서
커널이나 모듈 로드시 이 함수들을 찾아서 실행한다.
readelf -S hello_module.ko (정해진 섹션확인)

)

T initModule → init 함수가 실제 텍스트 섹션에 있음
syscall 등록 후 사용자 공간에서 호출하여 사용한다!
'Linux' 카테고리의 다른 글
| 문자 디바이스 파일 (주 번호와 부번호 할당, 번호 등록과 사용) (2) | 2025.08.17 |
|---|---|
| [리눅스 커널과 디바이스 드라이버]애플리케이션->syscall->vfs->디바이스파일open 까지 (2) | 2025.08.17 |
| syscall번호를 테이블에 넣어 커널에 빌트인하여 사용 (2) | 2025.08.17 |
| U-Boot 부팅 흐름 과정 요약 2 -Linux kernel 로드 (3) | 2025.08.16 |
| UART3 활성화하여 PC와 시리얼 통신[dtoverlay 사용해보기] (1) | 2025.08.16 |