4.执行各种模块的初始化 5.挂接根文件系统 6.启动第一个init进程
在4步骤之后,start_kernel--->rest_init
__initcall_start和__initcall_end在源码中并无定义,只是在include/linux/init.h中申明为外部变量。
arm平台下,连接控制脚本为vmlinux.lds, 它们定义是在/arch/arm/vmlinux.lds中,看下图红色标记部分。
其含义是指示连接程序让__initcall_start指向代码节.initcall.init的节首,而__initcall_end指向.initcall.init的节尾。
在内核中,只要把需要初始化调用的函数的指针放在__initcall_start和__initcall_end之间的节内,函数就会在内核初始化时被调用。
加入到.initcall.init的代码段,是按如上方式调用的。主要是各个驱动模块。
Machine_desc的是怎么加载的呢?
先看下面几个截图中红色标记部分:
由上图可以看到,成员函数init_machine就是在这里被调用的。但是它没有被显式调用,而是放在了arch_initcall这个宏里,去看看它怎么定义的:
#define arch_initcall(fn) __define_initcall(\#define __define_initcall(level,fn,id) \\
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库I2C驱动培训文档(4)在线全文阅读。
相关推荐: