内核模块编程求教!

我想问下 /proc/kallsyms 这个文件中的内核符号表都是可以用直接在模块编程中直接引用的么??
地址和符号名中间有字母 比如T t W 等等  这些字母都代表什么意思??
我用的是2.6.26.4的内核  在/proc/kallsyms  中找到 如下一行
c0105c10 T printk_address
那么我是不是可以直接调用printk_address呢??
如果不是 那么哪些符号是可以直接调用的 哪些是不能直接调用的??
我在源代码中找到了其实现代码
但是我如何找到对应函数的头文件?
该如何使用这个printk_address呢??

作者: losemyheaven   发布时间: 2011-03-08

在源码树下找到这个函数原型,在你要用的地方extern xxx  就可以直接用了

作者: amarant   发布时间: 2011-03-09

一般来说,你的内核模块只能使用那些在内核代码和其他模块代码中使用下面的宏导出的符号:

EXPORT_SYMBOL
EXPORT_SYMBOL_GPL

T t W 等字母表示的是该符号的类型。基本上大写的表示全局符号,而小写的表示本地符号。
具体表示什么意思,你可以参考内核代码树中的脚本: ./scripts/mksysmap

就像我们在应用层编写使用动态库的代码一样,内核符号也有三个种类:
1, 静态的。
      只局限在定义它的那个文件中使用;
2, 外部的。
      在内核代码文件A中定义,但在内核代码文件B中使用。这个时候需要用 extern
3, 导出的。
      在内核代码或者其他模块中用上面两个宏导出的。在你的模块中可直接使用

你可以写一个很小的模块测试一下,在里面定义上面三种类型的变量或函数,然后看看 /proc/kallsyms 文件中都有什么内容。

作者: juliantec   发布时间: 2011-03-09