由module_init()宏想到的
来源:互联网 发布:怀孕31周b超数据 编辑:程序博客网 时间:2024/05/17 18:45
一,前言
在开发嵌入式Linux驱动程序时,我们通常使用module_init及module_exit宏来指定一个驱动程序的入口函数和出口函数。如果驱动模块被编译并链接至内核中,内核启动的过程中会自动加载它。通过对这两个宏定义的分析,可以写出一个简化的间接地调用函数的例子,其基本的方法是通过GNU GCC支持的__attribute__扩展功能将与入口函数地址链接至ELF文件中的特定的段区,并使用链接脚本导出该段区的地址,这样就可以做到间接调用函数了。这可以视为使用C语言开发软件,模块化的一个高级方法。
二,GNU GCC的链接脚本
GNU binutils的文档中指出,链接器ld中内嵌了一个默认的链接脚本,使用--version参数可以输出该脚本,我们把它保存到internal-ldscript.ld:
三,使用__attribute__将函数地址信息指定到特定的段区
编写的测试代码如下:
从图中可以看到,在main函数中没有直接地调用simple_add和simple_mul这两个函数,而是访问了两个外部的结构体符号,即mfunc_info_start和mfunc_info_end,请注意这两个是“符号”,而不是指针(指针是变量,它们两个不是变量);同时,包含simple_add和simple_mul的函数地址和名称的结构体被指定到了.data.mfunc段区。
四,修改链接脚本
上图C代码中引用的两个符号mfunc_info_start和mfunc_info_end需要在链接脚本中导出,修改后的链接脚本为modified.ld,改动如下:
五,编译并测试
编译时需要指定链接脚本:
从图中可以看到,这样间接地调用函数是可行的。当然,Linux驱动开发使用的宏比这个要复杂得多,还要解决一些模块加载次序、依赖关系等,这就需要更深入的探究了。
1 0
- 由module_init()宏想到的
- 由本子想到的
- 由忧郁想到的
- 由电车男想到的
- 由MBV想到的
- 由“枣子”想到的
- 由 setMeidatime() 想到的
- 由ff想到的
- 由HelloWorld想到的
- 由观察想到的
- 由面试想到的
- 由自行车想到的......
- 由《变形金刚》想到的
- 由团队想到的.......
- 由PageRank想到的
- 由服务器想到的
- 由Signal想到的
- 由STL想到的
- android 代码实现手机自动恢复出厂设置不需要权限
- Git(Android Studio)项目提交更新到github详细步骤及可能遇到问题
- HiHo 第十三周 #1062 : 最近公共祖先·一 【map】
- Java中文件读写
- 弹性盒布局和网格单元格布局
- 由module_init()宏想到的
- 老友记引发的血案-第三天
- python学习(11)模块
- 当MyEclipse加载项目时 出现"building workspace has encountered a problem"错误的解决方法
- Mysql导入官方示例employees问题解决记录
- 使用Struts2实现简单的文件上传和下载
- Robotium整体源码浅析
- opencv2.4.13在ubuntu14.04上的安装
- 行内元素和块级元素的区别