Module의 기본명령어
/sbin/modprobe /sbin/modinfo /sbin/insmod /sbin/rmmod
module-init-tools download
http://ftp.kernel.org/pub/linux/utils/kernel/module-init-tools/
https://wiki.archlinux.org/index.php/Kernel_module
1.1 Module의 저장위치 및 설정
- 일반적인 Module의 저장위치
$ cd /lib/modules/2.6.x/ $ ll 합계 168 drwxr-sr-x 4 jhlee jhlee 4096 12월 16 11:00 ./ drwxr-sr-x 3 jhlee jhlee 4096 12월 26 2012 ../ lrwxrwxrwx 1 jhlee jhlee 91 12월 15 12:20 build -> /home/jhlee/dm8148/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/ drwxrwsr-x 4 jhlee jhlee 4096 12월 16 10:47 kernel/ -rw-r--r-- 1 root jhlee 123 12월 16 11:00 modules.alias -rw-r--r-- 1 root jhlee 177 12월 16 11:00 modules.alias.bin -rw-rw-r-- 1 jhlee jhlee 5654 12월 16 10:47 modules.builtin -rw-r--r-- 1 root jhlee 7133 12월 16 11:00 modules.builtin.bin -rw-r--r-- 1 root jhlee 69 12월 16 11:00 modules.ccwmap -rw-r--r-- 1 root jhlee 1093 12월 16 11:00 modules.dep -rw-r--r-- 1 root jhlee 1707 12월 16 11:00 modules.dep.bin -rw-r--r-- 1 root jhlee 52 12월 16 11:00 modules.devname -rw-r--r-- 1 root jhlee 73 12월 16 11:00 modules.ieee1394map -rw-r--r-- 1 root jhlee 141 12월 16 11:00 modules.inputmap -rw-r--r-- 1 root jhlee 81 12월 16 11:00 modules.isapnpmap -rw-r--r-- 1 root jhlee 74 12월 16 11:00 modules.ofmap -rw-rw-r-- 1 jhlee jhlee 172 12월 16 10:47 modules.order -rw-r--r-- 1 root jhlee 99 12월 16 11:00 modules.pcimap -rw-r--r-- 1 root jhlee 43 12월 16 11:00 modules.seriomap -rw-r--r-- 1 root jhlee 131 12월 16 11:00 modules.softdep -rw-r--r-- 1 root jhlee 28409 12월 16 11:00 modules.symbols -rw-r--r-- 1 root jhlee 37006 12월 16 11:00 modules.symbols.bin -rw-r--r-- 1 root jhlee 189 12월 16 11:00 modules.usbmap lrwxrwxrwx 1 jhlee jhlee 91 12월 16 10:47 source -> /home/jhlee/dm8148/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/ drwxr-sr-x 5 jhlee jhlee 4096 12월 31 2012 updates/
DM8147를 보면서, TI 상당히 복잡하게 설정이 되어있어, 내부를 자세히 보기로 결정.
modules.dep
modules.alias
https://www.kernel.org/doc/Documentation/kbuild/kbuild.txt
$ vi /etc/modprobe.d/blacklist 이부분의 기능 $ vi /etc/modprobe.d/media-controller-utils.conf blacklist vpss blacklist ti81xxfb blacklist sii9022a blacklist ti81xxhdmi blacklist tlc59108 $ vi /etc/modules.conf $ vi /etc/modules $ vi /etc/modutils
https://ko.wikipedia.org/wiki/Modprobe
1.3 udev와 연결과 설정
udev가 plug-in인을 감지하여 자동으로 module을 올리는 방식이다.
modules.usbmap
https://linux.die.net/man/8/usbmodules
2. Module의 정보확인방법
2.1 HOST OS에서 Module 정보 확인
- syslink modlue 확인
$ find . -name syslink.ko ./component-sources/syslink_2_20_02_20/packages/ti/syslink/utils/hlos/knl/Linux/syslink.ko ./component-sources/syslink_2_20_02_20/packages/ti/syslink/bin/TI814X/syslink.ko ./filesystem/ezsdk/lib/modules/2.6.37/kernel/drivers/dsp/syslink.ko $ modinfo ./component-sources/syslink_2_20_02_20/packages/ti/syslink/bin/TI814X/syslink.ko filename: ./component-sources/syslink_2_20_02_20/packages/ti/syslink/bin/TI814X/syslink.ko license: GPL v2 depends: vermagic: 2.6.37 mod_unload modversions ARMv7 p2v8 parm: TRACE:charp parm: TRACEENTER:charp parm: TRACEFAILURE:charp parm: TRACECLASS:charp
2.2 Target OS 에서 Module 정보확인
- syslink와 ti81xxfb 확인
# modinfo syslink filename: /lib/modules/2.6.37/kernel/drivers/dsp/syslink.ko license: GPL v2 depends: vermagic: 2.6.37 mod_unload modversions ARMv7 p2v8 parm: TRACE:charp parm: TRACEENTER:charp parm: TRACEFAILURE:charp parm: TRACECLASS:charp # modinfo ti81xxfb filename: /lib/modules/2.6.37/kernel/drivers/video/ti81xx/ti81xxfb/ti81xxfb.ko license: GPL v2 author: Yihe HU description: TI TI81XX framebuffer driver depends: vpss vermagic: 2.6.37 mod_unload modversions ARMv7 p2v8 parm: debug:bool parm: vram:charp parm: mmode:int
2.3 Module 정보분석
- vermagic
- depends
- parm
- charp = char pointer 로 string
- int = int
- bool = true or false
e.g. ti81xxfb debug=true vram=0:24M,1:16M,2:6M mmode=1
3. ModuleVersion 문제
Module은 Version을 Check하여 올리는 옵션이 있다.
가능하다면 사용하는것이 좋으며, 에러가 발생할 경우 좀더 자세한 에러를 보기 위해서
이 부분을 제거해보고 다시 TEST 해보자
3.1 HOST OS 확인 사항
- CONFIG_MODVERSIONS 사용시
$ cd linux // linux kernel $ vi .config ... CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set CONFIG_MODVERSIONS=y .... $ make uImage //ARCH , CROSS_COMPILE 이미 설정 $ cat System.map | grep 'notify_numintlines' c02b44cc T notify_numintlines c047f490 r __ksymtab_notify_numintlines c04862f0 r __kcrctab_notify_numintlines c04974f0 r __kstrtab_notify_numintlines
- CONFIG_MODVERSIONS 미사용
$ vi .config ... CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set CONFIG_MODVERSIONS is not set .... $ make uImage //ARCH , CROSS_COMPILE 이미 설정 $ cat System.map | grep 'notify_numintlines' c02b428c T notify_numintlines c046d488 r __ksymtab_notify_numintlines c0480c86 r __kstrtab_notify_numintlines
3.2 Target OS 확인 사항
아래와 같이 Target OS에서 Boot후 현재 심볼 테이블 확인 하여 본인의 uImage 확인
아래것은 CRC가 없기에, CONFIG_MODVERSIONS 미사용 Version이다 상위 uImage와 동일
$cat /proc/kallsyms | grep 'notify_numintlines' c02b428c T notify_numintlines c046d488 r __ksymtab_notify_numintlines c0480c86 r __kstrtab_notify_numintlines
Kernel을 Build 후 System.map과 Proc의 Symbol table을 보면 주소는 동일하다.
4. Module 관련의 에러사항
동일한 문제인데, 아래와 같이 KERNEL CONFIG을 잠시 제거하여 정확한 원인을 알자.
아래의 문제는 Kernel config을 수정 한 후 make uImage를 만들면, 심볼 테이블의 위치가
변경이 될 것이다.
Module은 Kernel의 Function을 사용을 하면 이부분에서 오류가 나는 것이다.
uImage가 만들어진 후에 이 symbol table 기반으로 관련 module을 다시 만들고 이를
file system에 적용한다면 문제가 없을 것이다.
- 문제발생-CONFIG_MODVERSION 사용할 경우
syslink: version magic '2.6.37 mod_unload modversions ARMv7 p2v8 ' should be '2.6.37 mod_unload ARMv7 p2v8 ' FATAL: Error inserting syslink (/lib/modules/2.6.37/kernel/drivers/dsp/syslink.ko): Invalid module format
- 문제발생-CONFIG_MODVERSION 미사용 할 경우
syslink모듈이 notify_xxx관련함수를 찾지 못하고 있다.
syslink: no symbol version for notify_numintlines syslink: Unknown symbol notify_numintlines (err -22) syslink: no symbol version for notify_send_event syslink: Unknown symbol notify_send_event (err -22)
- 해결방법-1
이부분에 대해 자세히 알고 싶어 아래와 같은 자료를 얻게 되었다.
$ make menuconfig Enable loadable module support --> Module versioning support $ vi .config ... CONFIG_MODVERSIONS=y ...
http://egloos.zum.com/studyfoss/v/5226996
$ vi .config CONFIG_CROSS_COMPILE="" CONFIG_LOCALVERSION=""
https://devtalk.nvidia.com/default/topic/921545/version-magic-does-not-match-in-kernel-module/