启动电源

步骤

  1. 按下电源键
  2. 硬件通电
  3. cpu从rom存储器的某个地址加载bootloader到内存ram中
  4. 执行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汇编部分源码详解