Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1079081
  • 博文数量: 277
  • 博客积分: 8313
  • 博客等级: 中将
  • 技术积分: 2976
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-22 11:25
文章分类

全部博文(277)

文章存档

2013年(17)

2012年(66)

2011年(104)

2010年(90)

我的朋友

分类: LINUX

2011-03-08 15:02:45

1.       当内核执行到 init/main.c里一个名叫do_initcalls的函数时,会执行 .initcall.init节里

各种xxx_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

知:subsys_initcall == __initcall_fn4 将被链接器放于section .initcall4.init. 中。

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

for (call = __initcall_start; call < __initcall_end; 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)

顺便说一句,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_ini

阅读(1014) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-27 13:38:00

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com