QNX Neutrino 系统启动序列架构
概述
QNX Neutrino 的启动过程由一系列面向任务的阶段组成,每个阶段由特定的组件负责处理。
这些核心任务包括:
- 操作系统必须从非易失性存储器中加载。
- 操作系统必须初始化自身,以及所有设备驱动和外设。
- HMI(人机界面)必须加载、初始化并开始运行。
- 应用软件必须加载、初始化并开始运行。
为确保软硬件组件在需要时已初始化就绪,系统架构师或设计者需要仔细规划每个阶段。QNX 提供了多种机制来满足特定的启动需求。本文将逐步介绍整个启动序列,并提供各阶段的优化技术。
下图展示了 QNX Neutrino OS 启动序列的各个阶段:
系统通电后,PLL、IPL和Startup program依次运行,将基础系统启动起来。基础系统主要是内核或核心操作系统。随后,Boot script运行以加载设备驱动、启动服务和应用。最后,主系统启动,包括 HMI 等主要应用的启动。
各启动阶段按执行顺序描述如下。
1. PLL(锁相环)
PLL 指处理器上电后到第一条指令开始执行之间的等待时间。大多数 CPU 都有一个 PLL,将主晶振频率分频为芯片使用的所有定时器。PLL 稳定到所需频率的时间通常是芯片启动时间中最长的部分。
PLL 阶段与操作系统无关,因 CPU 而异;在某些情况下,最长可能达到32 毫秒。请查阅硬件平台用户手册获取精确时序。
2. IPL(初始程序加载器)
QNX 提供了一个标准的最小化 IPL,执行配置内存控制器、初始化片选和/或 PCI 控制器、配置其他必要的 CPU 设置等最少步骤。这些步骤完成后,IPL 将Startup program从 IFS(Image Filesystem,镜像文件系统)复制到 RAM 中,并跳转过去继续执行。
IFS 包含 OS 镜像,由 startup program、内核、boot script 以及系统所需的其他驱动、应用程序和二进制文件组成。由于你可以控制 IFS 的内容,复制阶段的时间会有所不同,但它通常是内核启动过程中最长的部分。在极端情况下,如果系统包含非常大的镜像且没有 IFS 之外的文件系统,此阶段可能耗时较长(10 秒或更长)。
不过,你可以通过减小 IFS 体积来间接控制此阶段的长度。要添加、删除或配置 IFS 中存储的文件,可以编辑 buildfile 中的script块,或在 IDE 中使用 QNX System Builder。你还可以压缩镜像以减小 IFS 体积(代价是额外的解压缩开销,可以通过在 IPL 中启用缓存来加速)。
通常,bootloader 至少执行6 毫秒后才开始加载 OS 镜像。实际时间取决于 CPU 架构、板卡最小配置需求以及 bootloader 将控制权移交给 startup program 之前所做的操作。
某些板卡使用其他 bootloader(如 U-Boot)。这些 bootloader 不如 QNX IPL 快,因为 IPL 专门针对 QNX 系统进行了优化。建议用 IPL 替换你的 bootloader。
更多信息请参阅《Building Embedded Systems》中的 Initial Program Loaders (IPLs) 章节。
3. Startup Program(启动程序)
可引导 OS 镜像中的第一个程序是 startup program,其目的是:
- 初始化硬件
- 初始化系统页面(System Page)
- 初始化 callouts
- 加载内核(
procnto或procnto-smp)并将控制权转交给它
如果 OS 镜像尚未到达其在 RAM 中的最终位置,startup program 会将其复制过去,并在需要时进行解压缩。
启动过程中,内核会初始化 MMU(内存管理单元),创建用于处理分页、进程和异常的数据结构,并使能中断。此阶段完成后,内核完全可用,可以开始从 boot script 加载和运行用户进程。
4. Boot Script(启动脚本)
每块板卡都有一组不同的脚本来支持不同的配置。buildfile 中的script块可让你指定要启动的驱动和应用及其启动顺序。
你可以使用 boot script 启动需要在早期运行的服务和工具(例如,播放提示音、显示闪屏或显示摄像头的视频流),或者需要额外加载时间的服务(例如,磁盘驱动)。在可能的情况下,这些进程应以后台方式启动,以优化并行性并在系统所有组件启动完成前保持 CPU 的最高利用率。
限制 boot script 的内容也很重要,因为它包含在 IFS 中,添加的内容会增加 IFS 体积和加载时间。以下是一些可能需要在 boot script 中加载的内容:
- Screen 和摄像头服务
- 音频服务和早期提示音工具
- 磁盘驱动(然后挂载磁盘)
- 调试工具,如
slogger2和dumper - BSP 驱动,如串口驱动、实时时钟和其他硬件工具
- SLM和系统调试控制台
启动脚本最佳实践
- 尽量使用后台启动(
&)以利用 CPU 并行性 - 避免在 boot script 中包含过多内容,防止 IFS 膨胀
- 需要快速响应的服务优先启动
5. SLM(系统启动与监视器)
SLM 是一个用于启动系统所需进程的服务。通常,某些进程和应用不需要立即启动,例如网络连接(io-pkt),或者某些进程需要在主应用之前启动,例如 HMI。
在此阶段,SLM 会等待进一步的指令。SLM 由一组配置文件控制:
slm-config-all.xml— 全局配置slm-config-platform.xml— 平台特定配置
这些文件告诉 SLM 要启动哪些模块,以及模块内部或模块之间是否存在依赖关系。
更多信息请参阅 Utilities Reference 中的 System launch and monitor (SLM) 章节。
启动时间线总结
PLL → IPL → Startup Program → Boot Script → SLM │ │ │ │ │ │ 配置 │ 加载 │ 初始化硬件 │ 启动驱动 │ 启动应用 │ 时钟 │ 镜像 │ 加载内核 │ 和服务 │ 和 HMI| 阶段 | 主要工作 | 关键优化点 |
|---|---|---|
| PLL | CPU 时钟稳定 | CPU 硬件决定,不可控 |
| IPL | 配置内存/PCI,复制 IFS 到 RAM | 减小 IFS 体积,启用压缩 |
| Startup | 硬件初始化,加载内核 | 体积已很小(~45KB),优化空间有限 |
| Boot Script | 启动驱动和服务 | 后台启动,限制内容 |
| SLM | 启动应用和 HMI | 配置文件管理依赖关系 |
