Android系统启动(一)
第一部分:Bootloader启动
第二部分:Linux启动
第三部分:Android启动
一、init进程
二、init启动的各种服务
三、android启动图示
1、手机上电之后,bootloader通常都包含有处理器厂商开发的上电引导程序,不过也不是所有的处理都是这样,比如三星的S3C24X0系列,它的bootROM直接 跳到U-boot中执行,首先由bootROM将U-boot的前4KB拷贝到处理器ISRAM,接着在U-boot的前4KB中必须保证要完成的两项主 要工作:初始化DDR,nand和nand控制器,接着将U-boot剩余的code拷贝到SDRAM中,然后跳到SDRAM的对应地址上去继续跑U- boot。
2、汇编代码初始化
(1)设置CPU进入SVC(系统管理模式)
(2)关中断
(3)关看门狗
(4)设置数据、时钟、寄存器、复位、nand flash和ram等
3、C代码初始化
(1)申明一些数据结构,定义一些变量,初始化变量
(2)初始化CPU、主板、中断、环境变量、波特率、SDRAM等
(3)设备初始化,flash、内存等
4、到这里初始化完成,执行main_loop(),main_loop在标准输入设备中接受命令,然后分析,查找和执行
5、在上面的main_loop函数中,通常在开发完成的阶段都会设置一个bootcmd的环境,可以直接运行bootcmd的命令来直接加载kernel的Image然后移交控制权。如果进入了命令行模式,我们也可以手动输入命令来启动系统,输入的命令也是基本和bootcmd一样。
在继续往下之前,有必要提一下几种不同格式linux kernel编译之后所产生的镜像文件,包括其各种头和ramdisk的混合,容易让人迷糊。
ramdisk是linux内核启动过程中需要使用的一种临时文件系统,它要么单独编译成ramdisk.img(也有叫initrd或者initramfs),要么编译进内核。
Linux编译之后最终会产生zImage文件,不过呢,为了迎合U-boot的要求,所以也有专门为U-boot的引导做一个uImage,这个只是加 了一个U-boot中定义的一个head而已,用于U-boot中检查,当然前面的ramdisk.img也是需要加这个头的,头里面有这个Image的 魔数,大小,类型等信息。现在的android中的u-boot也有要求加头的,他对U-boot进行了改进和优化,做成了自己的一套检查机制,所以现在 android编译出来linux部分的Image的名字叫boot.img。
6、加载完成之后,会有一些执行环境的设置操作,例如关中断等,还会向内核传递一些参数
浙公网安备 33010602011771号