> 文章列表 > 如何将模块加载到linux内核

如何将模块加载到linux内核

如何将模块加载到linux内核

一 顺利的情况

假设存在一个文件叫mymq.c,下该文件相同目录下的makefile如下语句:

obj-y += mymq.o

然后编译:编译完成了以后,mymq.c文件中,有个函数叫mymq_open,搜索这个函数在不在System.map文件中,如果在,就说明这个模块被内置到内核中了。

执行grep -rn mymq_open System.map,在文件System.map中搜索函数mymq_open

二 没被内置成功的情况

如下所示:按照上面的简单配置,内核没有出现在符号表中,怎么办呢?

执行grep -rn mymq_open System.map,在文件System.map中搜索函数mymq_open,

 解决办法:

使用subsys_initcall而不是module_init,如下所示

subsys_initcall(mymq_init);

如果这样还不行的话,那就看看,mymq.c所在的目录是如果被上级目录链接的,就是上一级目录的Makefile,如下所示,

 obj-m += mymq/ 这样设置,mymq目录下的文件不会被编译进内核,

将obj-m += mymq/ 改成obj-y += mymq/

修改后如下所示: 

在次编译内核然后 ,执行grep -rn mymq_open System.map,在文件System.map中搜索函数mymq_open

 小结