12/16/2016

Kernel Module (모듈관련부분 조사 후 작성 )

1. kernel module 명령어

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 
module의 version이름으로 kernel 정보도 들어간다.
  • depends
이 module을 사용하기 위해서 필요한 module
  • parm
module 의 parameter로 module의 설정이 가능하다. 위의 예를 들면 이런식이다.
  1. charp = char pointer 로 string 
  2. int     = int
  3. 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 사용시
사용할 경우 아래와 같이 CRC가 추가 된다.

$ 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 미사용
심볼테이블에서 CRC 함수가 없으며,

$ 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 미사용 할 경우 
위의 CONFIG_MODVERSION을 사용하지 않을 경우, 이제 Debug을 해보자.
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
Module의 Version을 Check하지 하지 않지만, 다른 위 두번째 에러가 발생하여,
이부분에 대해 자세히 알고 싶어 아래와 같은 자료를 얻게 되었다.


$ 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/