当前位置: 技术问答>linux和unix
module_init(fn)其中fn的参数是如何传递的
来源: 互联网 发布时间:2016-12-05
本文导语: 如题,我最近看了一个板子的BSP文件,在定义了板子上的各个资源后,有如下调用 814 static int __init mach_mpc85xx_fixup(struct platform_device *pdev) 815 { 816 ppc_sys_fixup_mem_resource(pdev, CCSRBAR); 817 return 0; 818 } 819...
如题,我最近看了一个板子的BSP文件,在定义了板子上的各个资源后,有如下调用
814 static int __init mach_mpc85xx_fixup(struct platform_device *pdev)
815 {
816 ppc_sys_fixup_mem_resource(pdev, CCSRBAR);
817 return 0;
818 }
819
820 static int __init mach_mpc85xx_init(void)
821 {
822 ppc_sys_device_fixup = mach_mpc85xx_fixup;
823 return 0;
824 }
825
826 postcore_initcall(mach_mpc85xx_init);//这里的postcore_initcall定义为module_init,
//这里只传了一个函数名进去,那么函数参数是怎么传递进去的呢?
//mach_mpc85xx_fixup(struct platform_device *pdev)里的pdev是在哪个地方定义的呢?
|
mach_mpc85xx_fixup(struct platform_device *pdev)里的pdev是在哪个地方定义的呢?
==> 这个pdev是通过platform_device_register注册后传递的。
==> 这个pdev是通过platform_device_register注册后传递的。
|
这个是驱动程序
module_init相当于程序的main,是个入口点
跳转到init mach_mpc85xx_init这执行
struct platform_device *pdev的定义在什么地方,不知道,等待高人解答
菜鸟的解答,欢迎指正
module_init相当于程序的main,是个入口点
跳转到init mach_mpc85xx_init这执行
struct platform_device *pdev的定义在什么地方,不知道,等待高人解答
菜鸟的解答,欢迎指正
|
对于module_init分2种情况,一种是内核不支持module,一种是支持。
内核不支持module时,module_init实际上会展开成顶一个位于.initcall6.init section中的一个函数指针变量的赋值。在这种情况下,内核初始化时(在kernel_init内核线程中),会执行对应section的所有函数。
内核支持module时,module_init实际上会展开成
#define module_init(initfn)
static inline initcall_t __inittest(void)
{ return initfn; }
int init_module(void) __attribute__((alias(#initfn)));
在这种情况下,在用insmod之类加载模块时,最终会调用模块的init函数。
自己可以看看insmod的代码+内核kernel/module.c代码分析,如果懒的话,也可以看看IBM developer works上的一篇介绍文章:http://www.ibm.com/developerworks/cn/linux/l-lkm/
内核不支持module时,module_init实际上会展开成顶一个位于.initcall6.init section中的一个函数指针变量的赋值。在这种情况下,内核初始化时(在kernel_init内核线程中),会执行对应section的所有函数。
内核支持module时,module_init实际上会展开成
#define module_init(initfn)
static inline initcall_t __inittest(void)
{ return initfn; }
int init_module(void) __attribute__((alias(#initfn)));
在这种情况下,在用insmod之类加载模块时,最终会调用模块的init函数。
自己可以看看insmod的代码+内核kernel/module.c代码分析,如果懒的话,也可以看看IBM developer works上的一篇介绍文章:http://www.ibm.com/developerworks/cn/linux/l-lkm/
|
举个例子
命令行下:
编译模块后
加载模块,加载形式为
#insmod hello.ko count=0 string="hello"
OK,这就将两个参数传给了fun
//定义模块,文件名hello.c
#include
static int count;
static char *string;
MODULE_PARM(count,"I");//定义需要传入到模块的参数,"I",为整型
MODULE_PARM(string,"s");//"s"为字符串类型
int fun(int a,char *b)
{
}
module_init(fun);
//------
//------
命令行下:
编译模块后
加载模块,加载形式为
#insmod hello.ko count=0 string="hello"
OK,这就将两个参数传给了fun
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。