微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM体系架构下的linux启动之一,从bootloader到linux内核

ARM体系架构下的linux启动之一,从bootloader到linux内核

时间:11-09 来源:互联网 点击:
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行开始,便是函数的入口:

114 start:

115 .type start,#function

116 .rept 8

117 mov r0, r0

118 .endr

119

120 b 1f

121 .word 0x016f2818 @ Magic numbers to help the loader

122 .word start @ absolute load/run zImage address

123 .word _edata @ zImage end address

124 1: mov r7, r1 @ save architecture ID

125 mov r8, r2 @ save atags pointer

从这段代码中可以看出,总共操作的3个寄存器r0,r1,r2正是bootloader调用linux内核时需要操作的3个寄存器。r0寄存器中存放0。然后是r1的CPU类型和r2中的传入参数列表的指针地址。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top