内核版本:linux-3.4
启动流程:
1、比较机器ID
2、解析u-boot传入的启动参数
3、挂接根文件系统、执行第一个应用程序
1、比较机器ID
打开 vmlinux.lds.S 里面可以找到内核把初始化参数的段定义为了”.arch.info.init”
.init.arch.info : {
__arch_info_begin = .;
*(.arch.info.init)
__arch_info_end = .;
}
在内核源码的目录下可以输入指令查找一下谁调用了这个段:grep “.arch.info.init” * -nR
搜索到如下内容:
#define MACHINE_START(_type,_name) \
static const struct machine_desc __mach_desc_##_type \ /* ##是连词符号 */
__used \
__attribute__((__section__(".arch.info.init"))) = { \
.nr = MACH_TYPE_##_type, \
.name = _name,
#define MACHINE_END \
};
定义了一个宏来指定,可以接着在 sourceinsight 工程里面去搜索 MACHINE_START 和 MACHINE_END 这两个宏,看下具体谁使用了它,搜索结果如下 :
MACHINE_START(SUNXI, "sun8i")
.atag_offset = 0x100,
.init_machine = sunxi_dev_init,
.init_early = sunxi_init_early,
.map_io = sunxi_map_io,
#ifndef CONFIG_OF
.init_irq = sun8i_gic_init,
#endif
.handle_irq = gic_handle_irq,
.restart = sun8i_restart,
.timer = &sunxi_timer,
.dt_compat = NULL,
.reserve = sun8i_reserve,
.fixup = sun8i_fixup,
.nr_irqs = NR_IRQS,
#ifdef CONFIG_SMP
.smp = smp_ops(sunxi_smp_ops),
#ifdef CONFIG_ARCH_SUN8IW6
.smp_init = smp_init_ops(sun8i_smp_init_ops),
#endif
#endif
MACHINE_END
MACHINE_START 和 MACHINE_END 这两个就是定义一个结构体,这个结构体被强制的设置为一个属性,把它的段设置为 “.arch.info.init”,那么如果哪个文件下面有这些结构体的话,这些结构体就会被 vmlinux.lds.S 这个链接脚本组合在一起,我们可以把这段定义带入到刚才搜索到的那段 MA