Android kernel启动

来源:互联网 发布:apache 泛解析配置 编辑:程序博客网 时间:2024/06/04 22:40

简单学习下,kernel启动;

 boot.img包括boot header /kernel  /ramdisk /second stage (其中前3项是必须的,最后一项是可选的)mkbootimg.c

ramdisk.img在kernel启动过程中充当着第一阶段的文件系统,是一个CPIO格式打成的包。通俗上来讲他就是我们将生成的root目录,用CPIO方式进行了打包,然后在kernel启动过程中会被mount作为文件系统,当kernel启动完成以后会执行init,然后将system.img再mount进来作为Android的文件系统


过程:

1.bootloader会从boot.img的分区中将kernel和ramdisk分别读入RAM上面定义的地址中,然后就会跳到ZTEXTADDR开始执行

(ZTEXTADDR  boot.img运行时候zImage的起始地址,即kernel解压代码的地址)


2.bootloader将IMG载入RAM以后,并跳到zImage的地址开始解压

(ZRELADDR,就是解压后的kernel应该放在哪。这个参数一般都是arch/arm/mach-xxx下面的Makefile.boot来提供)

解压的source就是/arch/arm/boot/compressed/head.S

 因为没有将kernel解压在要求的地址,所以必须重定向,说穿了就是要将解压的kernel拷贝到正确的地址,因为正确的地址与zImage的地址是重合的,而要拷贝我们又要执行zImage的重定位代码,所以这里首先将重定位代码reloc_start拷贝到vmlinx上面,然后再将vmlinx拷贝到正确的地址并覆盖掉zImage。

vmlinx拷贝到正确的地址了,拷贝到正确的位置以后,就将kernel的首地址赋给PC,然后就跳转到真正kernel启动的过程


另外现在解压的代码head.S和misc.c一般都会以PIC的方式来编译,这样载入RAM在任何地方都可以运行,这里涉及到两次冲定位的过程

3.kernel启动以前的汇编之后我们来看看正式的c语言启动代码,也就是我们的start_kernel函数

 setup_arch(&command_line);

         /* 这是一个重量级的函数了,会比较仔细地分析一下,主要完成了4个方面的工作,一个就是取得MACHINE和PROCESSOR的信息然或将他们赋值给kernel相应的全局变量,然后呢是对boot_command_line和tags接行解析,再然后呢就是memory、cach的初始化,最后是为kernel的后续运行请求资源。 */

setup_arch和前面的head.S,head-common.S,proc-v6.S,board-msm7x27.c是紧密联系在一起的


http://linfengdu.blog.163.com/blog/static/11771073201110351053219/?suggestedreading&wumii

http://linfengdu.blog.163.com/blog/static/11771073201110345847553/


原创粉丝点击