导读 | ARM设备如何通过uboot启动Linux内核 |
(1)uboot的本质就是就是一个复杂点的裸机程序,和ARM部分写的裸机程序没有本质区别。
(2)内核本身也是一个裸机程序,和uboot、裸机程序无本质区别。要说不同的地方,那就是内核运行起来后,在软件上分为内核层和应用层,分层后两层的权限不同,内存访问和设备操作的管理上更加精细(内核可以随便访问各种硬件,而应用程序只能被限制地访问硬件和内存地址)。
(3)直观上来看,uboot的镜像是u-boot.bin,linux系统的镜像是zImage,这两个东西其实都是两个裸机程序镜像。从系统的启动角度来讲,内核其实就是一个大的复杂点的裸机程序。
(1)一个完整的软件+硬件的嵌入式系统,静止时(未上电时)bootloader、kernel、rootfs等必须的软件都以镜像的形式存储在启动介质中(x210中是iNand/SD卡),运行时都是在DDR内存中运行的,与存储介质无关。上面两个状态都是稳定状态,第三个状态是动态过程,即从静止态到运行态的过程,也就是启动过程。
(2)动态启动过程就是一个从SD卡逐步搬移到DDR内存,并且运行启动代码进行相关的硬件初始化和软件架构的建立,最终达到运行时稳定状态。
(3)静止时,u-boot.bin、kernel、rootfs都在SD卡中,它们不可能随意存在SD卡的任意位置,因此需要对SD卡进行一个分区,然后将各种镜像存在不同的分区,这样在启动过程中uboot、内核就知道到哪里去找。(uboot和kernel中的分区表必须一致,同时和SD卡的实际使用分区也要一致)
(1)uboot在第一阶段中进行重定位时将第二阶段(整个uboot)加载到DDR的0xC3E00000地址处,这个地址就是uboot的链接地址。
(2)内核也有类似要求,uboot启动内核时,将内核从SD卡读取放到DDR中(其实就是个重定位的过程),不能随意放置,必须放在内核的链接地址处,否则启动不起来。例如在x210中使用的内核链接地址是0x30008000。
(1)uboot是无条件启动的,从零开始启动的。
(2)内核是不能开机自动完全从零开始启动的,内核启动需要别人帮忙。uboot需帮助内核实现重定位(从SD卡到DDR),uboot还要给内核提供启动参数。
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/tech/linux/123951.html