linux 驱动程序开发,为什么要编译内核源码树?
2个回答
展开全部
驱动最终以*.ko的形式生成,insmod的本质就是将ko文件与运行的内核进行链接的过程。类似于编译helloworld的链接过程。链接必然需要先进行编译,以便确定所需的外部符号(EXPORT_SYMBOLS)是否存在,因为有些符号(函数或全局变量)在内核中,在驱动中如果使用到这些符号,必须预留一个位置,insmod时进一步确定这些符号的具体位置(符号绑定)。
如果内核都没有编译过,怎么知道这些符号有没有编入内核中?
关于这方面的知识可参照IBM developerworks上面的《Linux 可加载内核模块剖析》及相关文章。
如果内核都没有编译过,怎么知道这些符号有没有编入内核中?
关于这方面的知识可参照IBM developerworks上面的《Linux 可加载内核模块剖析》及相关文章。
更多追问追答
追问
我编写了一个Helloworld测试程序,不成功。内核源码树已经编译成功了,而且我现在的系统也是用新内核启动的,新内核是3.1.1的,就内核是3.1.0.7的,所以两个内核不一样。Make 这个Helloworld的时候,得到了 .ko文件,但是insmode hello.o的时候就显示:invalid format ,这是怎么回事啊?
追答
你是说你当前运行的内核是3.1.1,而helloworld是基于3.1.0.7的内核编译的?
我没编过3.x.x 的内核,不排除确实是版本间的微小差异(ko文件的组织不同,可能性极小)。你可以先通过nm工具查看helloworld.ko的符号,检查其中的外部符号是否在内核中存在("grep /proc/kallsyms ")。如果不行,劝你还是重新在新内核上编译ko
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询