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文件产生的链接模块进行比较。
- linux下模块编译基本知识和格式
- linux 下模块的编译和安装
- linux下编译apache模块
- Ubuntu下编译Linux内核和hello模块
- Linux 内核模块开发基本知识
- linux驱动之:模块基本知识
- Linux(Ubuntu)下编译内核模块
- linux下内核模块编译初阶
- Linux 下 Intel IPP 模块编译
- linux下快速编译模块的方法
- Linux下编译安装Apache及模块
- Linux下模块编译 MODPOST 0
- linux下 驱动模块编译步骤
- linux驱动中多个文件编译为一个模块格式
- Linux 内核编译步骤和模块加载
- linux 编译和加载卸载模块
- linux 模块的编译和加载
- 液晶显示模块的分类和基本知识
- LeetCode 292. Nim Game
- ElasticSearch--AdMaster使用案例
- jQuery自学教程(四)——事件
- Learning to Count Objects in Images
- HTTP 加密
- linux下模块编译基本知识和格式
- HDU 1284 钱币兑换问题 (完全背包)
- 24点javascript自动计算
- 332. Reconstruct Itinerary
- 《Android源码设计模式》读书笔记 (13) 第13章 备忘录模式
- h3c 三层交换机snmp 团体名称配置
- HDU 1284 钱币兑换问题(母函数)
- 【Android】安卓学习笔记之广播(一)动态注册监听网络变化
- android 开发技巧(3)--创建定制的 ViewGroup