鸿蒙南向开发教程 Day 3 附录:操作系统内核详解
本文介绍了操作系统内核的核心概念与功能。内核作为硬件与应用程序之间的中间层,主要承担资源管理、任务协调、系统保护和基础服务提供四大角色。其核心功能包括进程/线程管理(任务调度与CPU分配)、内存管理(地址映射与内存保护)、文件系统(数据存储组织)、设备驱动(硬件接口统一化)以及中断与系统调用(硬件响应与用户态交互)。文章通过分层架构图展示了用户空间、内核空间与硬件层的关系,并详细解析了进程调度和内
·
目标:理解操作系统内核的本质、职责、架构,以及 OpenHarmony 轻量系统内核(LiteOS-M)的设计
一、什么是内核(Kernel)?
1.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、传统 Windows
3.2 微内核(Microkernel)
┌─────────────────────────────────────────┐
│ 微内核架构(Minix、QNX) │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ 用户空间:应用、库 │ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │
│ │ │文件 │ │设备 │ │网络 │ │内存 │ │ │
│ │ │服务 │ │驱动 │ │服务 │ │服务 │ │ │
│ │ │进程 │ │进程 │ │进程 │ │进程 │ │ │
│ │ └─────┘ └─────┘ └─────┘ └─────┘ │ │
│ │ (以独立进程运行,通过 IPC 通信) │ │
│ └─────────────────────────────────────┘ │
│ ↓ IPC(进程间通信) │
│ ┌─────────────────────────────────────┐ │
│ │ 内核空间:最小化内核 │ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │
│ │ │进程 │ │线程 │ │IPC │ │ │
│ │ │调度 │ │管理 │ │机制 │ │ │
│ │ └─────┘ └─────┘ └─────┘ │ │
│ │ (仅保留最核心的功能) │ │
│ └─────────────────────────────────────┘ │
│ ↓ │
│ 硬件抽象层 │
│ ↓ │
│ 物理硬件 │
└─────────────────────────────────────────┘
特点:
- 内核仅保留最基本功能(调度、IPC、内存管理基础)
- 其他服务以独立用户态进程运行
- 稳定性高(服务崩溃不影响内核)
- 性能开销大(频繁 IPC)
- 代表:Minix、QNX、鸿蒙标准系统(部分设计)
3.3 混合内核(Hybrid Kernel)
┌─────────────────────────────────────────┐
│ 混合内核架构(Windows NT) │
│ │
│ 结合宏内核和微内核的优点: │
│ - 核心服务在内核态(性能) │
│ - 部分服务在用户态(稳定) │
│ │
│ 内核态:进程调度、内存管理、文件缓存 │
│ 用户态:图形界面、部分驱动、网络协议栈 │
└─────────────────────────────────────────┘
四、实时内核 vs 通用内核
| 特性 | 实时内核(RTOS) | 通用内核(Linux/Windows) |
|---|---|---|
| 设计目标 | 确定性响应时间 | 高吞吐量、公平性 |
| 调度策略 | 优先级抢占,无时间片轮转 | 时间片轮转,公平调度 |
| 中断延迟 | 微秒级(确定) | 毫秒级(不确定) |
| 内存分配 | 静态分配为主,禁止动态 | 动态分配,虚拟内存 |
| 任务切换 | 快速(数百个时钟周期) | 较慢(数千个时钟周期) |
| 适用场景 | 工业控制、汽车电子、物联网 | 桌面、服务器、手机 |
| 代表 | FreeRTOS、RT-Thread、LiteOS | Linux、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 │ │
│ │ - SRAM(352KB) │ │
│ │ - Flash(2MB) │ │
│ │ - 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 模式(处理模式) │ │
│ │ - 中断和异常处理 │ │
│ │ - 总是特权级 │ │
│ │ - 可以访问所有资源 │ │
│ └─────────────────────────────────────┘ │
│ │
│ Hi3861(Cortex-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、FreeRTOS) |
| OpenHarmony | 标准系统用 Linux,轻量系统用 LiteOS-M |
| LiteOS-M | 单进程多线程,无 MMU,抢占式调度,极致精简 |
| 特权级 | Cortex-M 的 Thread/Handler 模式,系统调用切换 |
| 启动流程 | 上电 → BootROM → 启动代码 → 内核初始化 → 调度器启动 → 用户任务 |
九、与前面知识的关系
Day 3 附录知识体系:
进程/线程(附录一) 内核(附录二)
│ │
│ 线程是内核调度的基本单位 │
└──────────┬─────────────┘
↓
┌─────────────┐
│ LiteOS-M │
│ 内核 │
│ │
│ 管理线程 │
│ 调度线程 │
│ 分配资源 │
└─────────────┘
↓
Day 4 ~ Day N
定时器、互斥锁、信号量...
(内核提供的同步机制)
更多推荐

所有评论(0)