目标:理解操作系统内核的本质、职责、架构,以及 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
         定时器、互斥锁、信号量...
         (内核提供的同步机制)
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐