嵌入式系统中主要分为三块,uboot、kernel和rootfs。嵌入式板子上电会先执行uboot,其中uboot启动分两个阶段。
State1:一般是汇编阶段
- 1)初始化时钟,关中断、开icache和dcache,关闭mmu,初始化sdram等
- 2)分配State2代码所需要的RAM空间
- 3)拷贝stage2的代码从flash拷贝到RAM中
- 4)设置堆栈指针
- 5)跳转到State2入口地址处
State2:一般是C语言阶段
- 1)初始化本阶段所用到的硬件设备,如uart终端等
- 2)检测MMU,内存映射‘
- 3)将内核和根文件系统镜像从FLASH到RAM空间中
- 4)设置内核启动参数
- 5)启动内核
由于uboot和内核启动的顺序是不一样的,他们两个是没有办法相互通信的,因此他们之间传递参数只能约定好一个地址,uboot启动完毕后,kernel会从这个地址上获取uboot传递的参数,除了约定地址之外,还规定参数的结构。
Uboot启动内核前,会设置r0 r1 r2这三个寄存器的地址的值
- 1)R0一般设置成0
- 2)R1一般设置成machine_id(如果使用设备树则这个参数不起作用)
- 3)R2一般为启动参数的首地址
uboot把内核加载到RAM中后,经过内核解压和初始化后,开始运行硬件初始化代码,进行一些列内核相关的初始化,挂载根文件系统等,然后调用第一个程序init(),init相当于一个主进程,开始等待运行用户应用程序,这样系统就算启动完成了。