鸿蒙南向开发教程 Day 3 附录:操作系统内核详解
目标理解操作系统内核的本质、职责、架构以及 OpenHarmony 轻量系统内核LiteOS-M的设计一、什么是内核Kernel1.1 核心定义内核是操作系统的核心组件是硬件与应用程序之间的中间层负责管理硬件资源、提供基础服务让用户程序可以安全、高效地运行。┌─────────────────────────────────────────┐ │ 用户空间User Space │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ 应用1 │ │ 应用2 │ │ 应用3 │ │ │ │ (App) │ │ (App) │ │ (App) │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ │ │ │ │ └────────────┼────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────┐ │ │ │ 系统调用接口System Call │ │ │ │ 用户程序 ↔ 内核的唯一合法通道 │ │ │ └─────────────────────────────────────┘ │ │ ↓ │ ├─────────────────────────────────────────┤ │ 内核空间Kernel Space │ │ ┌─────────────────────────────────────┐ │ │ │ 内核Kernel │ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 进程管理 │ │ 内存管理 │ │ │ │ │ │ (Task) │ │ (Memory)│ │ │ │ │ └─────────┘ └─────────┘ │ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 文件系统 │ │ 设备驱动 │ │ │ │ │ │ (VFS) │ │ (Driver)│ │ │ │ │ └─────────┘ └─────────┘ │ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 网络协议 │ │ 中断处理 │ │ │ │ │ │ (Network)│ │ (IRQ) │ │ │ │ │ └─────────┘ └─────────┘ │ │ │ └─────────────────────────────────────┘ │ │ ↓ │ ├─────────────────────────────────────────┤ │ 硬件层Hardware │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ CPU │ │ 内存 │ │ 外设 │ │ │ │ (ARM) │ │ (RAM) │ │ (UART) │ │ │ └─────────┘ └─────────┘ └─────────┘ │ └─────────────────────────────────────────┘1.2 内核的本质特性说明资源管理者管理 CPU、内存、I/O 设备等所有硬件资源仲裁者协调多个程序对资源的竞争访问保护者隔离用户程序防止恶意或错误操作破坏系统服务提供者提供进程管理、文件系统、网络通信等基础服务二、内核的核心职责2.1 五大核心功能┌─────────────────────────────────────────┐ │ 操作系统内核核心功能 │ ├─────────────────────────────────────────┤ │ 1. 进程/线程管理Process Management │ │ → 创建、调度、终止任务分配 CPU 时间 │ ├─────────────────────────────────────────┤ │ 2. 内存管理Memory Management │ │ → 分配/回收内存虚拟地址映射内存保护 │ ├─────────────────────────────────────────┤ │ 3. 文件系统File System │ │ → 组织、存储、访问磁盘上的数据 │ ├─────────────────────────────────────────┤ │ 4. 设备驱动Device Drivers │ │ → 控制硬件设备提供统一访问接口 │ ├─────────────────────────────────────────┤ │ 5. 中断与系统调用Interrupt Syscall │ │ → 响应硬件事件提供用户态进入内核的通道 │ └─────────────────────────────────────────┘2.2 进程/线程管理详解┌─────────────────────────────────────────┐ │ 进程/线程管理子系统 │ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ 创建 │ │ 调度器 │ │ │ │ fork() │───→│ Scheduler│ │ │ │ pthread │ │ 算法 │ │ │ │ create()│ │ │ │ │ └─────────┘ └───┬─────┘ │ │ │ │ │ ↓ │ │ ┌─────────────┐ │ │ │ 就绪队列 │ │ │ │ [Prio 0] → │ │ │ │ [Prio 1] → │ │ │ │ [Prio 2] → │ │ │ └──────┬──────┘ │ │ │ │ │ ↓ 上下文切换 │ │ ┌─────────────┐ │ │ │ CPU 运行 │ │ │ │ [当前任务] │ │ │ └─────────────┘ │ │ │ │ │ ↓ │ │ ┌─────────────┐ │ │ │ 状态转换 │ │ │ │ Running→ │ │ │ │ Blocked/ │ │ │ │ Ready/Dead │ │ │ └─────────────┘ │ └─────────────────────────────────────────┘2.3 内存管理详解┌─────────────────────────────────────────┐ │ 内存管理子系统 │ │ │ │ 虚拟地址空间每个进程/线程看到的内存 │ │ ┌─────────────────────────────────────┐ │ │ │ 0xFFFFFFFF 内核空间共享 │ │ │ │ ... │ │ │ ├─────────────────────────────────────┤ │ │ │ 0xC0000000 栈Stack │ │ │ │ ↓ 向下增长 │ │ │ │ ... │ │ │ ├─────────────────────────────────────┤ │ │ │ ... │ │ │ │ ↑ 向上增长 │ │ │ │ 0x08000000 堆Heap │ │ │ ├─────────────────────────────────────┤ │ │ │ 0x00010000 数据段Data │ │ │ ├─────────────────────────────────────┤ │ │ │ 0x00000000 代码段Text │ │ │ └─────────────────────────────────────┘ │ │ ↓ │ │ 页表/段表映射 │ │ ↓ │ │ 物理地址空间实际的硬件内存 │ │ ┌─────────────────────────────────────┐ │ │ │ RAM 芯片上的实际存储单元 │ │ │ │ [0x20000000] ... [0x2000FFFF] │ │ │ └─────────────────────────────────────┘ │ └─────────────────────────────────────────┘三、内核架构类型3.1 宏内核Monolithic Kernel┌─────────────────────────────────────────┐ │ 宏内核架构Linux │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ 用户空间应用、库、Shell │ │ │ └─────────────────────────────────────┘ │ │ ↓ 系统调用 │ │ ┌─────────────────────────────────────┐ │ │ │ 内核空间 │ │ │ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │ │ │进程 │ │内存 │ │文件 │ │网络 │ │ │ │ │ │管理 │ │管理 │ │系统 │ │协议 │ │ │ │ │ │ │ │ │ │ │ │栈 │ │ │ │ │ └─────┘ └─────┘ └─────┘ └─────┘ │ │ │ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │ │ │设备 │ │驱动 │ │调度 │ │中断 │ │ │ │ │ │驱动 │ │程序 │ │器 │ │处理 │ │ │ │ │ └─────┘ └─────┘ └─────┘ └─────┘ │ │ │ │ │ │ │ │ 所有模块编译在同一个内核镜像中 │ │ │ │ 运行在同一个地址空间 │ │ │ └─────────────────────────────────────┘ │ │ ↓ │ │ 硬件抽象层HAL │ │ ↓ │ │ 物理硬件 │ └─────────────────────────────────────────┘特点所有内核模块编译在一起共享内核地址空间性能高模块间直接函数调用无需跨进程通信稳定性差一个模块崩溃可能导致整个内核崩溃代表Linux、传统 Windows3.2 微内核Microkernel┌─────────────────────────────────────────┐ │ 微内核架构Minix、QNX │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ 用户空间应用、库 │ │ │ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │ │ │文件 │ │设备 │ │网络 │ │内存 │ │ │ │ │ │服务 │ │驱动 │ │服务 │ │服务 │ │ │ │ │ │进程 │ │进程 │ │进程 │ │进程 │ │ │ │ │ └─────┘ └─────┘ └─────┘ └─────┘ │ │ │ │ 以独立进程运行通过 IPC 通信 │ │ │ └─────────────────────────────────────┘ │ │ ↓ IPC进程间通信 │ │ ┌─────────────────────────────────────┐ │ │ │ 内核空间最小化内核 │ │ │ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │ │ │进程 │ │线程 │ │IPC │ │ │ │ │ │调度 │ │管理 │ │机制 │ │ │ │ │ └─────┘ └─────┘ └─────┘ │ │ │ │ 仅保留最核心的功能 │ │ │ └─────────────────────────────────────┘ │ │ ↓ │ │ 硬件抽象层 │ │ ↓ │ │ 物理硬件 │ └─────────────────────────────────────────┘特点内核仅保留最基本功能调度、IPC、内存管理基础其他服务以独立用户态进程运行稳定性高服务崩溃不影响内核性能开销大频繁 IPC代表Minix、QNX、鸿蒙标准系统部分设计3.3 混合内核Hybrid Kernel┌─────────────────────────────────────────┐ │ 混合内核架构Windows NT │ │ │ │ 结合宏内核和微内核的优点 │ │ - 核心服务在内核态性能 │ │ - 部分服务在用户态稳定 │ │ │ │ 内核态进程调度、内存管理、文件缓存 │ │ 用户态图形界面、部分驱动、网络协议栈 │ └─────────────────────────────────────────┘四、实时内核 vs 通用内核特性实时内核RTOS通用内核Linux/Windows设计目标确定性响应时间高吞吐量、公平性调度策略优先级抢占无时间片轮转时间片轮转公平调度中断延迟微秒级确定毫秒级不确定内存分配静态分配为主禁止动态动态分配虚拟内存任务切换快速数百个时钟周期较慢数千个时钟周期适用场景工业控制、汽车电子、物联网桌面、服务器、手机代表FreeRTOS、RT-Thread、LiteOSLinux、Windows五、OpenHarmony 的内核架构5.1 三种系统类型三种内核┌─────────────────────────────────────────┐ │ OpenHarmony 系统架构 │ ├─────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────┐ │ │ │ 标准系统Standard │ │ │ │ 设备手机、平板、智慧屏 │ │ │ │ 内核Linux │ │ │ │ 特点完整 Linux 内核支持多进程 │ │ │ └─────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ 小型系统Small │ │ │ │ 设备智能音箱、摄像头、路由器 │ │ │ │ 内核Linux / LiteOS-A │ │ │ │ 特点支持 MMU多进程资源受限 │ │ │ └─────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ 轻量系统Lite⭐ │ │ │ │ 设备传感器、手环、Hi3861 开发板 │ │ │ │ 内核LiteOS-M ⭐ │ │ │ │ 特点无 MMU单进程多线程极致精简 │ │ │ └─────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────┘5.2 LiteOS-M 内核详解Hi3861 使用┌─────────────────────────────────────────┐ │ LiteOS-M 内核架构 │ │ Hi3861 运行的内核 │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ 内核层Kernel │ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 任务管理 │ │ 内存管理 │ │ │ │ │ │ (Task) │ │ (Memory)│ │ │ │ │ │ │ │ 动态内存 │ │ │ │ │ │ - 创建 │ │ 静态内存 │ │ │ │ │ │ - 调度 │ │ 内存池 │ │ │ │ │ │ - 挂起 │ └─────────┘ │ │ │ │ │ - 删除 │ ┌─────────┐ │ │ │ │ └─────────┘ │ 中断管理 │ │ │ │ │ ┌─────────┐ │ (Hwi) │ │ │ │ │ │ 同步机制 │ │ │ │ │ │ │ │ - 互斥锁 │ │ - 注册 │ │ │ │ │ │ - 信号量 │ │ - 使能 │ │ │ │ │ │ - 事件 │ │ - 响应 │ │ │ │ │ │ - 消息队列│ └─────────┘ │ │ │ │ └─────────┘ ┌─────────┐ │ │ │ │ ┌─────────┐ │ 时间管理 │ │ │ │ │ │ 软件定时器│ │ (Tick) │ │ │ │ │ │ (Swtmr) │ │ │ │ │ │ │ └─────────┘ │ - 系统时钟│ │ │ │ │ │ - 延时 │ │ │ │ │ │ - 定时器 │ │ │ │ │ └─────────┘ │ │ │ └─────────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────┐ │ │ │ 硬件抽象层HAL │ │ │ │ - 启动代码Boot │ │ │ │ - 时钟配置 │ │ │ │ - 外设寄存器操作 │ │ │ └─────────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────┐ │ │ │ 硬件层 │ │ │ │ - Cortex-M0 CPU │ │ │ │ - SRAM352KB │ │ │ │ - Flash2MB │ │ │ │ - Wi-Fi 射频 │ │ │ │ - GPIO/UART/I2C/SPI/ADC │ │ │ └─────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────┘5.3 LiteOS-M 的关键设计设计特点说明原因单进程整个系统运行在一个地址空间Cortex-M0 无 MMU不支持虚拟内存多线程支持多个任务线程并发满足物联网设备的多任务需求抢占式调度优先级抢占 时间片轮转保证实时响应静态内存支持内存池减少碎片嵌入式设备内存有限Tickless 模式空闲时停止系统时钟降低功耗适合电池供电设备六、内核态 vs 用户态6.1 为什么需要区分┌─────────────────────────────────────────┐ │ CPU 特权级别ARM Cortex-M │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ Thread 模式线程模式 │ │ │ │ - 用户代码运行 │ │ │ │ - 特权级 / 非特权级 │ │ │ │ │ │ │ │ 非特权级受限访问 │ │ │ │ - 不能访问特殊寄存器 │ │ │ │ - 不能执行特权指令 │ │ │ │ - 访问内存受限MPU 保护 │ │ │ └─────────────────────────────────────┘ │ │ ↓ 异常 / 中断 │ │ ┌─────────────────────────────────────┐ │ │ │ Handler 模式处理模式 │ │ │ │ - 中断和异常处理 │ │ │ │ - 总是特权级 │ │ │ │ - 可以访问所有资源 │ │ │ └─────────────────────────────────────┘ │ │ │ │ Hi3861Cortex-M0实际运行 │ │ - 无 MPU内存保护单元可选 │ │ - 通常所有代码运行在特权级 │ │ - 内核态和用户态界限模糊 │ │ - 依赖软件设计保证安全 │ │ │ └─────────────────────────────────────────┘6.2 系统调用System Call┌─────────────────────────────────────────┐ │ 系统调用机制 │ │ │ │ 用户程序低特权级 │ │ ┌─────────────────────────────────────┐ │ │ │ printf(Hello) │ │ │ │ ↓ │ │ │ │ 调用 C 库函数 │ │ │ │ ↓ │ │ │ │ write(fd, buf, len) ← 系统调用封装 │ │ │ │ ↓ │ │ │ │ SVC #0x01 ← 触发软中断ARM │ │ │ └─────────────────────────────────────┘ │ │ ↓ 特权级切换 │ │ 内核高特权级 │ │ ┌─────────────────────────────────────┐ │ │ │ SVC 处理程序 │ │ │ │ ↓ │ │ │ │ 根据系统调用号分发 │ │ │ │ ↓ │ │ │ │ 内核态执行实际 I/O 操作 │ │ │ │ - 操作 UART 寄存器 │ │ │ │ - 输出字符到串口 │ │ │ └─────────────────────────────────────┘ │ │ ↓ 返回 │ │ 用户程序继续执行 │ │ │ │ 目的 │ │ 1. 保护硬件资源防止用户程序随意访问 │ │ 2. 统一接口简化编程 │ │ 3. 权限检查安全隔离 │ └─────────────────────────────────────────┘七、内核启动流程Hi3861 上电后发生了什么时间轴 → 1. 上电复位Power-on Reset ↓ 2. BootROM 执行芯片固化代码 - 从 Flash 加载启动代码到 RAM - 校验完整性 ↓ 3. 启动代码Startup - 初始化栈指针SP - 初始化中断向量表 - 复制数据段到 RAM - 清零 BSS 段 ↓ 4. 进入 main() / app_init() - 初始化硬件时钟、GPIO、UART - 初始化 LiteOS-M 内核 ↓ 5. LiteOS-M 内核初始化 ┌─────────────────────────────────────┐ │ osKernelInitialize() │ │ - 初始化任务控制块数组 │ │ - 初始化就绪队列 │ │ - 初始化定时器队列 │ │ - 初始化内存管理 │ └─────────────────────────────────────┘ ↓ 6. 创建初始任务 ┌─────────────────────────────────────┐ │ osThreadNew(AppMainTask, ...) │ │ - 分配栈空间 │ │ - 设置入口函数 │ │ - 加入就绪队列 │ └─────────────────────────────────────┘ ↓ 7. 启动调度器 ┌─────────────────────────────────────┐ │ osKernelStart() │ │ - 设置系统 tick 定时器 │ │ - 触发 PendSV 异常开始调度 │ │ - 切换到第一个就绪任务 │ └─────────────────────────────────────┘ ↓ 8. 用户任务运行 ┌─────────────────────────────────────┐ │ AppMainTask 执行 │ │ - 调用 APP_FEATURE_INIT 注册的函数 │ │ - 创建用户线程Thread_1, Thread_2 │ │ - 各线程开始执行业务逻辑 │ └─────────────────────────────────────┘八、总结要点内容内核本质硬件与应用之间的中间层资源管理者核心功能进程/线程管理、内存管理、文件系统、设备驱动、中断处理架构类型宏内核Linux、微内核Minix、混合内核Windows实时内核确定性响应适合嵌入式LiteOS-M、FreeRTOSOpenHarmony标准系统用 Linux轻量系统用 LiteOS-MLiteOS-M单进程多线程无 MMU抢占式调度极致精简特权级Cortex-M 的 Thread/Handler 模式系统调用切换启动流程上电 → BootROM → 启动代码 → 内核初始化 → 调度器启动 → 用户任务九、与前面知识的关系Day 3 附录知识体系 进程/线程附录一 内核附录二 │ │ │ 线程是内核调度的基本单位 │ └──────────┬─────────────┘ ↓ ┌─────────────┐ │ LiteOS-M │ │ 内核 │ │ │ │ 管理线程 │ │ 调度线程 │ │ 分配资源 │ └─────────────┘ ↓ Day 4 ~ Day N 定时器、互斥锁、信号量... 内核提供的同步机制