Zephyr 目前不支持某些 ISA 和 ABI 架构。如果您希望在这些架构上运行 Zephyr,需要做一些架构相关的移植工作。
-
Zephyr 目前支持的 ISA 和 ABI 架构包括:
-
- x86_32 ISA with System V ABI
- x86_32 ISA with IAMCU ABI
- ARMv7-M ISA with Thumb2 instruction set and ARM Embedded ABI (aeabi)
- ARCv2 ISA
架构相关的移植可以划分为几个部分,其中一部分是必须的,另一些是可选的:
-
- 早期的启动过程: 必须的。当 CPU 复位后,每种架构都需要做不同的处理。
- 中断和异常处理: 必须的。每种架构以特定的方式处理异步和未请求事件。
- 线程上下文切换: 必须的。 Zephyr 的上下文切换依赖于 ABI。不同的 ISA 需要保存不同的寄存器集合。
- 线程的创建和结束: 必须的。线程的初始化帧依赖于 ABI 和架构。线程的终止也类似。
- 设备驱动程序: 部分是必须的,部分是可选的。大多数情况下,系统的时钟定时器和中断控制器都是与架构绑定在一起的。
- 工具库: 必须的。由于性能问题,内核的一些通用 API 依赖于架构相关的实现。
- CPU 空转/电源管理: 可选的。大多数架构都实现了让 CPU 睡眠的指令。
- Fault 处理: 可选的。 主要与架构相关的调试、处理线程致命错误相关。
- 链接脚本和工具链: 必须的。 编译系统在链接镜像时,极有可能需要一些架构相关 的细节。
早期的启动过程
早期的启动过程是为了让系统从复位状态切换到能运行 C 代码的状态。大多数情况下都只需要很少的步骤,只有个别架构需要略多的处理。
-
所有架构的通用步骤:
-
- 设置初始化栈。
- 如果运行的是 XIP 内核,将初始化代码从 ROM 拷贝到 RAM。
- 如果没有使用 ELF 加载器,初始化 BSS 段。
- 跳转到
_Cstart()
去初始化内核。_Cstart()
负责从系统启动时的虚拟上下文切换到后台/空转任务。
一些架构相关的步骤可能包括:
-
- 如果处于 x86_32 实模式,则需要切换到 32 位的保护模式。
- 设置 x86_32 的段寄存器,以处理 boot loader。
- 处理 Cortex-M3/4 的开发板相关的看门狗。
- 将 Cortex-M3/4 的栈由 MSP 切换到 PSP。
中断和异常处理
每种架构的中断和异常处理都是不同的。
当设备希望向处理器发送信号时,它的内部需要完成一些额外的工作,然后再发出一个中断。当线程需要执行一个不能由软件自身按照串行流程的方式处理的操作时,它会发出一个异常。中断和异常都会将控制权限传递给处理者。对于中断,这个处理者被叫做 ISR。处理者执行中断或异常请求的工作。对于中断,这些工作是与设备相关的。对于异常,这些工作依赖于异常,但是大多数时候内核的核心都会自己提供处理者。
-
除处理者需要执行相关工作外,内核还必须执行一些额外的工作。