임베디드/[ Linux Kernel ]

[ Linux Kernel ] 22. 커널에 모듈 추가하기

kim.svadoz 2020. 10. 30. 17:46
728x90
반응형

22. 커널에 모듈 추가하기

Kconfig

=> Kernel에 새로운 장치를 추가하고, 해당하는 모듈을 추가하기 위해서는 먼저 Kconfig라는 파일을 알아야한다~

Kconfig를 정리하자면

  1. Tree구주로 된 Configuration option들의 집합으로 자신만의 종속성을 가지고 있음
  2. Child Entry는 Parent Entry가 선택되어 볼 수 있게 되었을 때만 보임
  3. Menu entry들은 각각의 config option을 정의하고 있음.
  4. 각각의 config option들은 자신만의 type을 가지며, tristate, bool type이 있음
    • tristate : <*> <M> <>
    • bool : <*> <>
  5. 이 type에 따라 어떤 선택을 하느냐에 따라 Kernel에 해당 모듈을 포함하는 여부가 결정된다.( 보통 make menuconfig에서 선택한다.)
  6. 사용자에 의해 값이 설정되지 않으면 default값이 config option에 설정된다.

아래는 한 폴더의 sound/drivers/Kconfig 파일의 일부이다.

image-20201030162612401

  • 모듈을 선택할 때 사용하지 않는 기능을 <*>로 선택하면 빌드되어 나오는 이미지(Kernel을 full build할 때 나오는 zImage)가 너무 커지며, 필요한 기능을 < >으로 선택하면 kernel이 정상동작 하지 않을 수 있으니 주의해서 선택해야 한다.
  • <M>으로 선택할 경우 Kernel 빌드시 ***.ko 파일을 생성하며, Kernel이 부팅하며 초기화 작업을 할 때 insmod로 등록하여 사용한다. 해당 모듈을 내릴 때는 rmmod를 사용한다.

Module 추가하기

Module을 추가하기 위해서는 MakefileKconfig를 수정해야 한다.

여기서는 그중 그나마 만만한 Char Device Driver 쪽에 추가하기로 한다.

  1. Makefile

    • 먼저 [Kernel] / drivers / char / Makefile을 연다.
    • 모듈이 빌드되도록 내용을 추가한다.
    image-20201030163247119
    • CONFIG_MY_MODULE이라는 이름이 중요한데, 이 이름을 Kconfig 파일과 맞춰야 하기 때문이다.
  2. Kconfig

    • [Kernel] / drivers / char / Kconfig 파일을 연다
    • Config에 추가되도록 아래 내용을 추가한다.
    image-20201030163355759
    • DEPEND_ON_ME를 선택해야 MY_MODULE이 보인다.
    • MY_MODULE은 Makefile의 CONFIG_MY_MODULE과 CONFIG_ 뒷 부분이 일치해야 한다.
  3. $ make menuconfig

    • Device Drivers > Character devices로 들어간다.
    • 아래 그림에서처럼 *Depend on test *항목이 추가됨을 볼 수 있다.
    image-20201030163536757
    • Depend on test를 선택한다.
    image-20201030163557669
    • Add My Module이 추가 된 것을 볼 수 있다.

    *참고로 menuconfig에서 []형태는 bool type이고 <>형태는 tristate type이다.

    • Kernel이 빌드된 후에 depends on이 사용된 항목들은 [kernel] / include / generated / autoconfig.h에 define값이 만들어 진다.
    image-20201030163720768
    • 위의 그림처럼 CONFIG_MY_MODULE이 포함됨을 확인할 수 있다.
728x90
반응형