linux下模块编译基本知识和格式

来源:互联网 发布:易众联读卡器软件 编辑:程序博客网 时间:2024/06/08 02:56

Make -c 只编译不链接

Make -C切换到指定目录再执行make过程

make -C $(LINUXROOT) M=$(PWD)

EXTRA_CFLAGS="$(EXTRA_FLAGS)" modules

当用户需要以某个内核为基础编译一个外部模块的话,程序会自动到指定的dir目录中查找模块源码,将其编译,产生ko文件。


当链接一个模块时,必须用合适的地址替换在模块对象代码中引用的所有全局内核符号,这个操作与在用户态编译程序时链接程序所执行的操作十分相似。

内核使用一些专门的内核符号表,用于保存模块访问的符号和相应的地址。它们在内核代码段中分三节:__kstrtab(保存符号名),__ksymtab(所有模块可使用的符号地址),__ksymtab_gpl(GPL兼容许可证下发布的模块可以使用的符号地址)。当用于静态链接内核代码内时,EXPORT_SYMBOL与EXPORT_SYMBOL_GPL宏让C编译器分别往__ksymtab和__ksymtab_gpl部分相应地加入一个专用符号。

已链接的模块可以导出自己的符号,这样其他模块就可以访问这些符号。

当模块链接时,模块的导出符号被拷贝到两个内存数组中,而其地址保存在module对象的syms和gpl_syms字段中。

insmod程序执行一下操作:1 从命令行中读取要链接的模块名 2 确定模块对象代码所在的文件在系统目录树中的位置。对应文件通常在/lib/modules的某个子目录中 3从磁盘读入存有模块目标代码的文件 4调用init_module系统调用,传入参数:存有模块目标代码的用户态缓冲区地址,目标代码长度和存有insmod程序所需要参数的用户态内存区。

为了自动链接模块,内核要创建一个内核线程来执行modprobe外部程序,该程序要考虑由于模块依赖所引起的所有可能因素。

一个称为depmod的外部命令在系统启动时被执行。该程序查找为正在运行的内核而编译的所有模块,这些模块通常存在/lib/modules/目录下。然后它就把所有的模块间依赖关系写入一个名为modules.dep的文件,这样modprobe就可以对该文件中存放的信息和/proc/modules文件产生的链接模块进行比较。


0 0
原创粉丝点击