系统基础
启动过程(简要)
- 上电 → BootROM(SoC 固件):读取 RCW、初始化最小硬件、加载 BL2 到 SRAM
- BL2(ATF early):初始化 DDR,加载 BL31(ATF runtime)和 BL33(通常为 U‑Boot)
- BL31(ATF runtime):设置安全环境后跳转 U‑Boot
- U‑Boot:初始化外设,加载 Linux 内核与设备树
此流程适用于常见 Arm SoC 的多阶段引导;具体实现随平台而异。
文件加载路径
传统路径:磁盘 → DMA → 内核页缓存(page cache)→ copy_to_user → 用户缓冲区
零拷贝优化:磁盘文件 → 页缓存 → 直接映射到用户虚拟地址(避免额外内存拷贝)。
原因与优点:
- 零拷贝:减少一次内存复制,提升性能
- 按需分页:只在访问时加载页面,节省内存
- 虚拟地址映射:允许映射超大文件以便用户态直接访问
kdump(核心转储)
kdump 使用 kexec 启动一个最小化内核(crash
kernel),并通过 ELF 等描述将崩溃内核的物理内存映射成
/proc/vmcore。用户态工具可像读文件一样转储系统内存用于分析。
UIO vs VFIO
| 方案 | 作用 | 优缺点 |
|---|---|---|
| UIO | 用户态访问设备寄存器 | 简单、适合调试;不提供安全 DMA/隔离,风险较高 |
| VFIO | 通过 IOMMU 提供安全 DMA 与设备直通 | 安全、支持高性能网卡与 DPDK;适合生产和虚拟化 |
页表与多级页表的由来
CPU 的 MMU 要求一级页表是可直接索引的连续数组;单级页表对 64 位地址空间过大,多级页表通过分层索引实现稀疏映射,节省内存并支持按需分配。
系统硬件
| 特性 | ARM/嵌入式 | x86/PCIe |
|---|---|---|
| 硬件发现 | 写死,需 DT 或 platform_data | 自描述,扫描 PCI 配置空间 |
| 驱动匹配 | compatible / platform_device |
VendorID/DeviceID |
| 硬件信息 | DT 或手工提供地址、中断、时钟 | PCI 配置空间提供资源和中断 |
| 驱动初始化 | probe() 读取资源 |
probe() 读取 PCI 配置空间资源 |
| 可移植性 | 需修改 DT | 基本通用 |