首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

由驱动板级初始化产生的联想:内核解压,机器码匹配,uboot之bootm解析

2013-03-06 
由驱动板级初始化发生的联想:内核解压,机器码匹配,uboot之bootm解析arch/arm/kernel/common_head.S中调用

由驱动板级初始化发生的联想:内核解压,机器码匹配,uboot之bootm解析

arch/arm/kernel/common_head.S中调用该函数)中,进入C 语言的世界完成后续的操作回到setup_arch函数中,这样在start_kernel前已经完成了__machine_arch_type的相关初始化(在解压函数decompress_kernel中),当然这个机器码是来自uboot传入的,后续会以这个机器码为核心,获取结构体machine_desc,这个就是最初由编译指定放在section(arch.info.init)处的板级信息,由汇编级代码lookup_machine_type来完成遍历该端,获取该结构体对象,期间完成相关机器码的匹配。

以后内核就可以使用这个machine_desc这个对象了。

接下去分析的内容就是machine_desc的init_machine在哪里被调用,这个函数必须被最先初始化调用,因为有很多板级的设备需要被先注册信息?

代码位于:arch\arm\kernel\setup.c中

在函数setup_arch中:

static int __init customize_machine(void){/* customizes platform devices, or adds new ones */if (init_machine)init_machine();return 0;}arch_initcall(customize_machine);

可以看到这部分的代码在这里执行,而且属于arch_initcall(3)调用,比其他的设备类型等级要高,先初始化,但是也需要在setup_arch中获取init_machine的函数指针。

总结出来的板级初始化调用过程如下:

start_kernel()--->setup_arch()(架构上面的初始化,获取板级信息,)--->到rest_init函数。

在rest_init函数中fork一个子线程带调用kernel_init在该函数中调用流程:do_basic_setup--->do_initcalls()--->customize_machine()--->xxx_machine_init(),

完成一次板级信息的初始化。其他的模块init也在do_initcalls()这里安不同级别完成注册和执行。

最后在Kernel_init函数中执行init_post,exec("/sbin/init");表明从内核空间正式进入用户空间,开始后续的各种etc下配置脚本执行和用户空间的相关初始化。




本文均属自己阅读源码的点滴总结,转账请注明出处谢谢。

欢迎和大家交流。qq:1037701636 email: gzzaigcn2009@163.com,gzzaigcn2012@gmail.com

 


热点排行