Kernel中Module调用编译问题
来源:互联网 发布:数据产品经理面试题目 编辑:程序博客网 时间:2024/06/15 16:34
最近在kernel driver中写一个功能,遇到module之间调用的问题,以此记录一下。
在kernel中两个不同的模块之间是不能通过简单的#include “XX.h”来相互调用函数的。如果这样在调用的地方不会出现语法错误,但是在最后生成模块文件XXX.ko时就会出现error:“xxxx” 【xxx.ko】undefined! 在生成 .ko文件(kernel object)这个时候就报资源没有定义的错误了。
出现这样的情况是因为kernel的模块都是相互独立的,如果要共享就必须做一些处理了。
以/driver中的gpio和ir这两个module为例,如下:
ir.c中调用gpio中对gpio口操作的函数:
void MDrv_GPIO_Set_High(U8 u8IndexGPIO);
一.被调用模块gpio
1.gpio.c中被调用函数必须添加EXPORT_SYMBOL声明,如下:
void MDrv_GPIO_Set_High(U8 u8IndexGPIO){ MHal_GPIO_Set_High(u8IndexGPIO);}EXPORT_SYMBOL(MDrv_GPIO_Set_High);
用EXPORT_SYMBOL声明一下函数是为了奖此函数导出,可供外部使用!
2.gpio模块中的Kconfig以及Makefile设置
Kconfig中必须定义Kernel中相对应的模块名:config MDRV_GPIO
Makefile中编译目标:
obj-$(CONFIG_MDRV_GPIO)+= gpio.o
3.被调用模块上层的Makefile配置
gpio.c的上一目录driver中的Makefile中:
obj-$(CONFIG_MDRV_GPIO) += gpio/
其中gpio也就是gpio.c所在的目录。
这样MDrv_GPIO_Set_High才能被正确的导出到kernel的根目录下的Module.symvers文件,这个文件里面就是kernel里所有的EXPORT_SYMBOL和EXPORT_SYMBOL_GPL导出来的符号以及函数,EXPORT_SYMBOL_GPL和EXPORT_SYMBOL的区别就是:如果module的协议不是GPL的, 那么EXPORT_SYMBOL_GPL导出的那些符号以及函数,就用不了!
这个Module.symvers每次编译kernel的时候重新生成!
如果碰到上面的编译错误,第一步就是到这个Module.symvers中查看是否有你要调用的函数或者变量!
在ir.c中需要调用MDrv_GPIO_Set_High(U8 u8IndexGPIO):
extern void MDrv_GPIO_Set_High(U8 u8IndexGPIO);
这样ir.c中的函数就可以调用MDrv_GPIO_Set_High(U8 u8IndexGPIO)这个函数啦!
撰写不易,转载请注明出处http://blog.csdn.net/jscese/article/details/16991679
- Kernel中Module调用编译问题
- linux kernel、module编译
- [笔记]Android中在外部编译kernel module示例
- linux kernel module 编译和加载
- linux kernel编译问题
- Kernel编译参数问题
- kernel 编译环境问题
- 解决 vmware kernel module updater 问题
- Linux Kernel Module 中传递参数
- Linux kernel中module相关命令集
- Kernel Module
- 解决编译/home/module/hello.c:1: 错误:代码模式‘kernel’在 32 位模式下不受支持问题
- [module] -- yii2中如何调用module
- 解决“HAX kernel module is not installed!”的问题
- Android模拟器-HAX kernel module is not installed问题
- 在android手机中添加一个新的kernel module
- flex module不编译的问题
- gradle关于依赖module编译问题
- 混合背包
- 【转载】ubuntu server 命令行下更换软件源
- 遇到的问题-----------perl脚本用handlersocket把数据插入mysql执行时报错lock_tables
- Android下的两个文件系统:proc和sys(二)
- 阅读大型代码库的方法
- Kernel中Module调用编译问题
- [转]Linux tcpdump命令详解
- Flex 加载资源方式
- 关于 多进程epoll 与 “惊群”问题
- poj 1088 滑雪_记忆化搜索
- Objective-C 异步任务
- 动态规划的01背包问题---关于国王开矿的故事
- 深入Struts2的配置文件
- 看开源代码利器—用Graphviz + CodeViz生成C/C++函数调用图(call graph)