Chinaunix首页 | 论坛 | 博客
  • 博客访问: 80425
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-19 21:02
文章分类

全部博文(21)

文章存档

2018年(3)

2016年(1)

2015年(2)

2014年(1)

2013年(14)

我的朋友

分类: 其他平台

2013-05-20 21:09:54

在linux内核代码里, 到处充满了subsys_initcall,这个调用是用来干吗的呢?有人回答是系统启动时候用来初始化某些系统的,具体怎么初始化的呢,说起来还是有点复杂。

在linux/init.h里,有这样一段代码:

#define pure_initcall(fn)  __define_initcall("0",fn,1)

#define core_initcall(fn)  __define_initcall("1",fn,1)
#define core_initcall_sync(fn)  __define_initcall("1s",fn,1s)
#define postcore_initcall(fn)  __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
#define arch_initcall(fn)  __define_initcall("3",fn,3)
#define arch_initcall_sync(fn)  __define_initcall("3s",fn,3s)
#define subsys_initcall(fn)  __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
#define fs_initcall(fn)   __define_initcall("5",fn,5)
#define fs_initcall_sync(fn)  __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn)  __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn)  __define_initcall("6",fn,6)
#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
#define late_initcall(fn)  __define_initcall("7",fn,7)
#define late_initcall_sync(fn)  __define_initcall("7s",fn,7s)

而__define_initcall又被定义为

#define __define_initcall(level,fn,id) \
static initcall_t __initcall_##fn##id __attribute_used__ \
__attribute__((__section__(".initcall" level ".init"))) = fn

so subsys_initcall == __initcall_fn4 它将被链接器放于section  .initcall4.init. 中

在启动过程中,do_basic_setup--->do_initcalls里有以下代码:

for (call = __initcall_start; call 

.    .....

  result = (*call)();

.    ........

  
}
这个__initcall_start是在文件arch/xxx/kernel/vmlinux.lds.S定义的:

__initcall_start = .;
   INITCALLS
  __initcall_end = .;

INITCALLS被定义于asm-generic/vmlinux.lds.h:

#define INITCALLS       \
   *(.initcall0.init)      \
   *(.initcall0s.init)      \
   *(.initcall1.init)      \
   *(.initcall1s.init)      \
   *(.initcall2.init)      \
   *(.initcall2s.init)      \
   *(.initcall3.init)      \
   *(.initcall3s.init)      \
   *(.initcall4.init)      \
   *(.initcall4s.init)      \
   *(.initcall5.init)      \
   *(.initcall5s.init)      \
*(.initcallrootfs.init)      \
   *(.initcall6.init)      \
   *(.initcall6s.init)      \
   *(.initcall7.init)      \
   *(.initcall7s.init)



好了,subsys_callinit应该讲清楚来龙去脉了,顺便说一句,在linux/init.h里,还有这样一段代码:

#define core_initcall(fn)  module_init(fn)
#define postcore_initcall(fn)  module_init(fn)
#define arch_initcall(fn)  module_init(fn)
#define subsys_initcall(fn)  module_init(fn)
#define fs_initcall(fn)   module_init(fn)
#define device_initcall(fn)  module_init(fn)
#define late_initcall(fn)  module_init(fn)

这是在定义MODULE变量的情况下对subsys_initcall的定义,就是说对于驱动模块,使用subsys_initcall等价于使用module_init
                
                
                

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/76292/showart_1921221.html
阅读(1479) | 评论(0) | 转发(0) |
0

上一篇:RF差分网络匹配

下一篇:SDRAM布线

给主人留下些什么吧!~~