基于ARM-Linux嵌入式系统引导程序的设计
0. 概述
在专用的嵌入式开发板上运行操作系统(如Linux)已经变得越来越流行,而Bootloader就是为引导操作系统内核运行的一段代码。通过它可以初始化硬件设备、建立或检测内存空间的映射,其功能有点类似于PC机的BIOS(基本输入输出系统)程序。它的主要作用是为运行操作系统提供基本的运行环境,并操作系统的内核装载到存储器(RAM)中的合适位置上去运行。本文将以Samsung公司的S3C2410开发板为开发平台,具体阐述了Bootloader的运行原理与实现分析。
Bootloader程序与CPU芯片的内核结构、具体芯片和使用的操作系统等因素有着密切关系,因此要为所有类型的嵌入式开发板建立一个通用的Bootloader几乎是不可能的。尽管如此,本文将尽量对Bootloader归纳出一些通用的概念,以帮助特定用户设计实现自己的Bootloader。
1. 系统组成
典型的ARM嵌入式系统硬件平台一般包括一个以ARM为内核的处理器、存储器和必要的外部接口与设备。在本系统中,采用内嵌ARM920T的Samsung公司S3C2410处理器,工作频率200MHz,存储器使用2MB的Nor Flash和64MB的SDRAM,外部接口除了用于下载和通信的串口,还配备有以太网接口、USB接口。
软件平台由以下部分组成:Bootloader、嵌入式操作系统内核(Kernel)、文件系统(File system)[1]。其中,嵌入式操作系统内核是嵌入式系统加电运行后的管理平台,负责实时性任务和多任务的管理。文件系统是嵌入式系统软件平台占用存储量最大的一部分,也是与用户开发最相关的一部分。它存储了系统配置文件、系统程序、用户应用程序和必需的驱动程序。 软件平台固化在Flash中,通常分为三个区,具体分布空间如图1。
图1. Flash中的布局
2、Bootloader运行流程
系统加电或复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址上取指令。比如Sansung S3C2410 CPU,在系统加电或复位时就会从地址0x00000000处读取它的第一条指令。基于CPU构建的嵌入式系统则通常都会有某种类型的固态存储设备(如本例中的FLASH)被映射到这个预先安排的地址上,而Bootloader程序一般正是被烧录或者下载到固态存储设备的0x00000000地址处,因此在系统在加电或复位后,CPU将会首先执行Bootloader程序。一个典型简单的Bootloader运行流程图如图2所示[2]。
图2. Bootloader运行流程图
由于Bootloader的实现依赖于CPU的体系结构,因此Bootloader功能的实现基本可分为Stage1和Stage2两大部分,分别运行于系统的ROM和RAM中。依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在Stage1 中,基本都用汇编语言来实现,以达到简短精练的目的。而Stage2则通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性[3]。
相关文章
- 2023-12-06双导联输人心电采集控制系统
- 2022-07-15基于FPGA的2M误码测试仪设计
- 2022-06-14基于CAN_BUS的控制器调试系统的设计
- 2023-04-26地铁列车运行引起的振动对精密仪器的影响研究
- 2023-05-23智能车磁导航中的信号调理电路设计
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。