免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7515 | 回复: 4
打印 上一主题 下一主题

关于module_init问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-23 11:07 |只看该作者 |倒序浏览
(版本为2.6.17.7)
内核初始化设备驱动的过程:start_kernel()->rest_init()->do_basic_setup()->do_initcalls()
函数do_initcalls如下:
  for (call = __initcall_start; call < __initcall_end; call++) {//循环调用__initcall_start与__initcall_end之间函数
             .........
                 result = (*call)();
             .........
}
关于module_init的定义如下:
#define __define_initcall(level,fn) \
  90        static initcall_t __initcall_##fn __attribute_used__ \
  91        __attribute__((__section__(".initcall" level ".init"))) = fn

#define device_initcall(fn)             __define_initcall("6",fn)

#define __initcall(fn)    device_initcall(fn)

#define module_init(x)  __initcall(x);

文件linux/arch/arm/kernel/vmlinux.lds.S  中
__initcall_start = .;
  49                        *(.initcall1.init)
  50                        *(.initcall2.init)
  51                        *(.initcall3.init)
  52                        *(.initcall4.init)
  53                        *(.initcall5.init)
  54                        *(.initcall6.init)
  55                        *(.initcall7.init)
  56                __initcall_end = .;

module_init应该对应着(.initcall6.init)(根据上面的原代码),现在的问题是,内核的drivers中有许多调用了module_init宏,而 *(.initcall6.init)只能存放一个函数指针,那为什么每一个调用了module_init宏的模块都能被执行呢?

请朋友们指点!

[ 本帖最后由 小z 于 2008-7-23 12:58 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-07-23 13:01 |只看该作者
为什么你认为只能存一个指针

论坛徽章:
0
3 [报告]
发表于 2008-07-23 13:06 |只看该作者
module_init这个是只有在该模块以module方式存在的时候才有意义,当你加载该模块的时候才会去调用它,加载哪个模块,就调用哪个模块的module_init。

如果那个模块本身直接编译进内核了,那它的代码就直接放在内核中相应的区域了,系统启动的时候自动就调用这些函数了。

论坛徽章:
0
4 [报告]
发表于 2008-07-23 15:45 |只看该作者

理解错误

*(.initcall6.init)
在这里.initcall6.init是一个数据段的名称,这句话的意思是所有声明要放在这个段的数据都将按顺序存放在这个段里。
每个module_init都将定义一个函数指针,这些函数指针被指定要放在.initcall6.init这个段里,它们将按顺序排列。这样在内核启动的时候,它会根据这些函数指针按顺序调用所有的函数。

论坛徽章:
0
5 [报告]
发表于 2008-07-23 21:13 |只看该作者
建议楼主去读读linker and loader 这本书
http://download.csdn.net/source/331053

[ 本帖最后由 readkernel 于 2008-7-23 21:16 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP