1. bootloader的发动
bootloader自身叫做嵌入式体系的引导程序。可是,它支撑X86,MIPS,PowerPC,ARM等多种体系架构。
关于操作体系的发动来讲,当机器开端上电时,首要加载bootloader,它用来完结最基本的硬件的初始化,然后加载Linux内核。
用于ARM的bootloader一般为U-BOOT,用它来完结对linux内核的加载设置,一般bootloader烧写在开发板的Flash里,包含Nor Flash或Nand Flash,其间因为NorFlash支撑芯片内履行XIP(eXcute In Place),代码能够直接在FLASH上履行,而NandFlash需求把代码拷到RAM中再去履行。可是RAM的处理速度比Flash的处理速度要快得多,一般依然把代码放在RAM中履行。
一般的bootloader需求完结以下五种功用:
1)RAM的初始化:为调用linux内核做准备。
2)串口的初始化:因为一般的嵌入式体系开发板上没有视频终端,只能用串口进行开发,串口的初始化非常重要。
3)检测处理器类型:用来预处理加载内核的处理器类型的传递作业。
4)设置Linux的发动参数:包含加载地址,发动方法(从本地分区或NFS进行根文件体系加载),以及Linux根文件体系
的加载方法。通常用一个符号列表来记载linux内核发动的各个参数。
5)调用linux内核镜像:此刻ARM的处理器中的几个特别的寄存器值:r0=0,r1=处理器类型,r2=符号列表在RAM中的方位。
2. linux kernel的发动剖析
首要从http://www.kernel.org 上下载一个linux内核的标准版,然后
$make menuconfig
这时你会发现,里边装备的体系架构为X86的,找不到关于ARM装备的相关选项,这时因为当时的内核体系架构与你用于开发的电脑上的体系架构如出一辙。假如要做ARM架构下的装备:
$make menuconfig ARCH=arm
便能够对ARM体系下的linux内核进行装备操作。
假如需求编译,还要指定穿插编译器和体系架构类型。
关于linux的内核一般有两种映像,一种对错紧缩的映像:Image,另一种是他的紧缩版zImage,在紧缩的镜像前端还包含了解紧缩的代码。因为嵌入式体系的存储空间较小,一般会选用zImage的内核,献身速度,可是能得到较小的内核。
Linux内核中zImage的进口程序为arch/arm/boot/compressed/head.S
这个文件首要完结以下作业:
1)敞开MMU和Cache
2)调用decompress_kernel()解压内核
3)调用call_kernel()进入非紧缩内核Image 的发动
head.S文件剖析:
在113行以上是关于debug的相关代码和ARM的不同版别的不同。从114行开端,就是函数的进口:
从这段代码中能够看出,一共操作的3个寄存器r0,r1,r2正是bootloader调用linux内核时需求操作的3个寄存器。r0寄存器中寄存0。然后是r1的CPU类型和r2中的传入参数列表的指针地址。