基础知识 · 2024年 9月 11日·205 次浏览 2

ARM处理器的启动流程

ARM处理器的启动流程涉及多个步骤,从硬件初始化到加载操作系统或应用程序。以下是ARM架构下典型嵌入式设备的启动流程,涵盖从复位到操作系统运行的整个过程。

  1. 硬件复位(Reset)
  2. Bootloader 引导程序启动
  3. 内存初始化
  4. 加载操作系统内核
  5. 操作系统初始化

1. 硬件复位(Reset)

当设备上电或重启时,系统会执行复位操作。

  • 复位向量:在复位时,ARM CPU自动跳转到固定的内存地址,称为复位向量(通常是0x00000000或0xFFFF0000)。在这个位置,存放着启动代码的入口点,通常是第一条指令。
  • 启动模式:ARM处理器启动后,会进入某种模式(如Supervisor模式),并关闭中断。此时CPU通常只处理基本的初始化任务。

2. Bootloader 引导程序启动

Bootloader 是一个小型程序,它负责从非易失性存储器(如Flash或ROM)加载操作系统或应用程序。

启动流程如下:

  • Bootloader 阶段 1
    • 处理器初始化:在复位后,Bootloader首先会对CPU和基本的硬件进行初始化。这包括设置寄存器、配置堆栈指针(SP)、禁用中断等。
    • 时钟和电源配置:初始化时钟系统,为系统提供稳定的时钟信号。同时,设置电源管理,保证系统各个组件工作在合适的电压范围内。
  • Bootloader 阶段 2
    • 初始化内存:如果系统使用了DRAM等动态内存,Bootloader 会负责初始化这些内存,确保它们能正常工作。
    • 加载操作系统内核或应用程序:Bootloader接着会从Flash存储器或其他存储设备中读取操作系统内核或应用程序,并将其加载到内存(RAM)中。
    • 跳转到内核启动地址:最后,Bootloader将控制权转交给操作系统内核,跳转到内核的入口点。

在一些ARM设备中,Bootloader分为两个阶段:

  • 第一阶段 Bootloader(如ROM Code):这是在芯片上硬编码的Bootloader,负责最基本的硬件初始化。
  • 第二阶段 Bootloader(如U-Boot):更复杂的Bootloader,通常位于Flash存储中,负责加载和启动操作系统。

3. 内存初始化

在操作系统或应用程序启动之前,内存的初始化是至关重要的一步。

  • 堆栈初始化:Bootloader会初始化堆栈指针,确保程序有足够的栈空间来进行函数调用和中断处理。
  • 全局数据初始化:内存中全局变量、静态变量需要被清零或设定为初始值,尤其是未初始化的全局变量区(BSS段)需要设置为0。
  • 时钟、缓存配置:在进入操作系统之前,还可能会配置处理器的时钟频率和缓存,以提升后续的性能。

4. 加载操作系统内核

Bootloader的核心任务就是将操作系统内核从存储器加载到内存中。

  • 加载内核:操作系统内核从Flash、SD卡、eMMC等存储设备加载到RAM中执行。这一过程可能包括解压缩或解密操作。
  • 内核启动:内核启动时,Bootloader通常会将一些必要的信息传递给内核,如内存布局、启动参数等。
  • 跳转到内核:当内核加载完毕后,Bootloader将控制权交给操作系统,CPU跳转到内核的入口地址,开始执行操作系统。

5. 操作系统初始化

操作系统内核接管控制权后,接下来的任务包括:

  • 初始化硬件设备:操作系统会检测和初始化系统中的各种硬件设备,如中断控制器、定时器、I/O设备等。
  • 内存管理:操作系统会设置内存管理单元(MMU),启用虚拟内存等内存保护机制。这一步对于操作系统的多任务、多进程功能非常重要。
  • 创建内核线程或任务:操作系统内核会启动第一个用户空间的任务,或创建内核线程来处理系统的初始化任务。
  • 挂载文件系统:操作系统加载并挂载文件系统,准备好用户空间的运行环境。
  • 启动用户应用程序:内核最终会启动用户级别的程序(如Linux中的init进程),或直接运行预先加载的应用程序。

6. 进入运行状态

在操作系统初始化完成后,系统进入正常运行状态,CPU会根据操作系统的调度规则运行用户应用程序或响应外部中断事件。


总结:ARM 启动流程的主要步骤

  1. 硬件复位:系统上电或复位后,跳转到复位向量执行初始化代码。
  2. Bootloader 启动:负责加载操作系统内核或应用程序,并执行基本硬件初始化。
  3. 内存初始化:Bootloader初始化内存,包括堆栈、全局变量等。
  4. 加载操作系统:将操作系统内核从存储设备加载到内存。
  5. 操作系统初始化:内核接管控制权,完成设备初始化和内存管理。
  6. 启动用户程序:操作系统启动用户级程序,系统进入正常工作状态。

这个启动流程是嵌入式开发中的关键部分,特别是在ARM平台上开发定制操作系统或嵌入式应用时,理解这些步骤对调试和优化启动过程非常有帮助。