启动电源
步骤
- 按下电源键
- 硬件通电
- cpu从rom存储器的某个地址加载bootloader到内存ram中
- 执行bootloader
注
- pc启动系统时会先执行BIOS,然后BIOS会选择某个设备(分区),也即时选择操作系统,接下来会将执行权限交给存储在被选择设备的第一个扇区的Bootloader,开始初始化硬件并加载执行内核。
- 安卓只有一个分区,没有BIOS,在加电后会直接选择ROM中的某个地址加载Bootloader。
执行bootloader
步骤
stage1
基本的硬件初始化,为stage2和内核的执行准备硬件环境,通常用汇编语言编写。也是引导程序依赖CPU体系的原因。
代码在start.S文件中。
- cpu进入svc模式
- 关闭看门狗
- 关闭中断
- 初始化堆栈
- 如果需要进行cpu初始化
stage2
设置内存,网络等属性,将内核从flash中加载到RAM里面,加快内核启动速度,通常用c语言编写,方便实现复杂功能并且拥有良好的可移植性。
libarm/board.c的start armboot是c启动代码中c语言的主函数和入口函数。
- 执行一些列初始化函数
- 读取环境变量
- 如果有网卡则根据环境变量设置IP MAC等属性
- 进入命令行模式
- 执行命令启动系统
- 将三个参数传递给内核,并且将跳转到内核开始执行
注
- bootloader一般和CPU和电路板的配置有关,所以没有通用的bootloader,各个厂商的bootloader都有不同。
- 比较流行的Bootloader有armboot,redboot,u-boot等,其中u-boot能适应多个体系结构,功能比较强大,比较受欢迎,但是相对更为复杂。
- 传递给内核的参数是方便内核适配板子环境,传递过去的有内存起始地址,内存大小,CPU ID等
linux内核启动
步骤
参考
http://t.zoukankan.com/shed-p-3726874.html
https://blog.csdn.net/hli22222/article/details/124539619
https://www.jianshu.com/p/0a33cdf914bb
https://www.cnblogs.com/pngcui/p/4665106.html----------------详解带源码启动过程
https://blog.csdn.net/hygzxf/article/details/7477609-------------------bootloader汇编部分源码详解