리눅스 디바이스 드라이버 기본 뼈대 구조 (모듈로 구현할때)

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

  1. __define_initcall(initModule,init)
    )
  • fn 함수 포인터를
  • sectionc(__sec)라는 특정 섹션에 넣고 static으로 선언하며, __used 속성으로 컴파일러가 최적화하지 않도록 한다.

fn 함수 주소가 .initcallxxx같은 섹션에 기록되어서

커널이나 모듈 로드시 이 함수들을 찾아서 실행한다.

readelf -S hello_module.ko (정해진 섹션확인)

)


T initModule → init 함수가 실제 텍스트 섹션에 있음
syscall 등록 후 사용자 공간에서 호출하여 사용한다!

+ Recent posts