QNX启动流程

IFS(startup header + image)

操作系统映像(OS Image) 是包含操作系统、您的可执行文件以及可能与您的程序相关的任何数据文件的文件。操作系统映像包括操作系统(procnto)、启动代码、启动和运行操作系统所需的库(libc.so),以及访问基本硬件所需的任何驱动程序或其他代码和文件。
通常,小型嵌入式系统只有一个(可引导的)操作系统映像。在QNX系统中,这包括以下组件:

  • 启动代码:startup-*
  • 操作系统内核和进程管理器:procnto
  • 驱动程序和管理器(例如,io-pkt、devnp-ncm.so、devc-ser8250、devb-eide、esh(嵌入式shell)、ksh)
  • 应用程序
  • 数据文件

启动后,QNX操作系统映像的内容作为文件系统显示在:/proc/boot。事实上,理解操作系统映像的一个好方法是将其视为一个小型文件系统。

在QNX语言中,操作系统映像通常简称为IFS,即图像文件系统。这个IFS有一个小的目录结构和一些文件。该目录告诉操作系统内核和进程管理器procnto操作系统映像中文件的名称和位置。当QNX嵌入式系统运行时,即使操作系统映像位于/proc/boot,也可以像访问任何其他只读文件系统一样访问它。

启动过程

在这里插入图片描述

1. BootRom做最少的硬件初始化,跳至IPL其余的由IPL完成,有些芯片无bootrom。

  • a. BootRom + IPL/uboot,热启动(BootRom已经初始化过了hw/cpu一些配置)
  • b. Uboot
  • c. IPL,冷启动(hw/cpu一些配置全由初始化)

2. IPL启动【ipl比uboot更快,IPL的主要职责就是进行最小的硬件配置以启动Startup程序】

IPL源码分析link文件,启动头分析(启动头一个结构体在startup.h)
手册翻译

- src\hardware\ipl\boards\xzynq-frgen21\xzynq-frgen21.lnk的链接来看第一个执行
-src\hardware\ipl\boards\xzynq-frgen21\_start.S

a. 初始化内核可运行的基本硬件
  • 配置芯片选择和PCI控制器、时钟和内存控制器
  • 通过I2C设置电源管理IC(PMIC(Power Management IC)电压轨)
  • 设置一些GPIO管脚来控制复位管脚
  • 配置一个定时器来精确测量延迟

实际上,就配置了cache,然后就jump2c

b. 运行start.s程序

为C语言环境设置堆栈。堆栈允许运行main.c程序。

-src\hardware\ipl\boards\xzynq-frgen21\main.c

a. IPL 的第一部分中未完成初始化的硬件(内核可运行的基本硬件)
b. 将操作系统映像加载到RAM中
  • ifs(image filesystem)组成:IFS(startup header + qnx image)应该是包括startup+os+buildfile+驱动,app,二进制执行文件。
  • Image storage镜像存储介质及存储方式(是否压缩)对IPL设计影响
  • 线性ROM(例如,NOR FLASH),可直接寻址(线性映射设备可以直接映射到处理器的地址空间)
    • 压缩,将整个IFS(包括启动代码)cp到临时RAM中
    • 非压缩,XIP(就地执行启动代码)或者只需要将startup程序拷贝到RAM(sdmmc_load_file())或者将整个IFS cp到最终RAM
  • 非线性ROM(例如 eMMC、SD 卡或 SPI NOR 设备),不能直接寻址
    • 压缩,将整个IFS cp到临时RAM中
    • 非压缩,将整个IFS cp到最终RAM
c.当操作系统映像位于可以执行的位置(RAM或XIP的线性映射存储)时, 扫描内存查找并验证IFS并返回addr【addr=image_scan_2()】
d. 调用image_setup()来检查启动标头结构,然后使用IFS已复制到RAM中的地址修补其startup_vaddr成员。当image_setup()返回时,启动代码应位于RAM(可以执行的位置)中,并且操作系统映像的地址应位于startup_header结构的startup_vaddr成员中。(image_setup_2(addr))

IPL使用启动头文件(startup.h)将信息传递给启动程序

e. 跳转到加载好的IFS执行startup代码将控制权交给启动代码(image_start_2(addr))

注意:IPL的两个部分都存储在引导设备上的相同位置。第一部分,由BootRom激活,是用汇编语言编写的,通常是常规的_start[ab]。第二部分是用C写的,完成第一部分未完成的初始化任务[abc]。

3. 操作系统镜像IFS部分

a. 启动代码
  • 配置硬件,包括定时器、中断控制器和高速缓存控制器等OS可以运行的最小HW环境(可引导操作系统映像中的第一个程序,指的是操作系统代码,指main.c,启动代码执行的初始化量取决于在IPL中完成的操作)

  • 拷贝(IFS)OS到RAM的把权限给OS。如果在启动代码开始执行时IFS不在其在RAM中的最终位置,则启动代码会将其复制到那里。addr,image重用大小都是启动头startup.h定义。

      	src\hardware\startup\lib\aarch64\_start.S
      	--->hardware/startup/lib/arm/cstart.S(设置sp跳转到_main)
      	--->\src\hardware\startup\lib\_main.c(调用startup.h,和main.c)
        --->src\hardware\startup\boards\xzynq\frgen21\main.c
    

启动代码包含在IFS文件中,但在OS开始执行后不再需要。启动代码的最终任务是加载OS内核和进程管理器(procnto),进程管理器在启动一个个进程。

b. 操作系统内核
c. buildfile,指定要启动的驱动程序和应用程序,以及启动顺序。
d. 驱动及应用程秩序,二进制文件。