博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
说说subsys_initcall[转]
阅读量:5301 次
发布时间:2019-06-14

本文共 2486 字,大约阅读时间需要 8 分钟。

 

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 < __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)

 

 

 

好了,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

 

 

转载于:https://www.cnblogs.com/kuangniuniu/p/3267634.html

你可能感兴趣的文章
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
属性动画
查看>>
标识符
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Win7中不能调试windows service
查看>>
通过httplib2 探索的学习的最佳方式
查看>>
快来熟练使用 Mac 编程
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
使用pager进行分页
查看>>
UVA - 1592 Database
查看>>
Fine Uploader文件上传组件
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
consonant combination
查看>>