LKM(Loadable Kernel Module)可以调用的内核函数及变量都列在/usr/src/linux-headers-xxxxxxxxx/Module.symvers里。有些资料说是在/proc/kallsyms里,这是不对的。kallsyms里列出的是内核中的各种符号,但并不是所有的符号都可以被LKM调用。如果使用了不可用的符号,insmod的时候会报错:Unknown symbol in module
如果想调用Module.symvers以外的内核函数,必须修改内核。找到该函数,在函数结束的“}”后加上一行:
EXPORT_SYMBOL(funcname); |
在LKM的源文件中,用extern声明一下该函数。如果这个函数是系统调用,在extern后面还要加上asmlinkage,否则参数不会正确传递。