操作系统开发:(11) RTOS 与 GPOS 的分界线:MMU

1. GPOS

1.1 概念

GPOS,即通用操作系统或分时操作系统,是一种为通用计算场景设计的操作系统,通过虚拟内存、多任务调度、丰富驱动等机制,支持复杂应用并发运行,追求"整体效率"而非"单任务实时性"。

特征 说明
设计理念 公平 > 确定:所有任务共享资源,按需调度
内存管理 MMU + 虚拟内存:进程隔离、按需分页、Swap 交换
调度策略 动态优先级 + 时间片轮转,优化吞吐量与响应平衡
系统服务 完整 POSIX/API、文件系统、网络栈、GUI 框架
可扩展性 支持动态加载模块、多用户、多进程、容器化

1.2 基石

虚拟内存系统(GPOS 的基石)关键能力

  • 进程隔离:每个进程拥有独立 4GB 虚拟空间,互不干扰
  • 内存超售:虚拟内存总量 > 物理 RAM(依赖 Swap)
  • 写时复制 (CoW):fork() 时共享物理页,写时才复制,提升效率
  • 内存映射文件:文件直接映射到虚拟地址,零拷贝 I/O

1.3 调度策略

GPOS:

复制代码
核心思想:让每个任务获得"公平的 CPU 时间"

调度逻辑:
1. 每个任务有一个"虚拟运行时间"(vruntime)
2. 调度器总是选择 vruntime 最小的任务执行
3. 即使高优先级任务,也要"适当等待"保证公平

问题:
- 紧急任务可能因为"公平"而延迟
- 无法保证"10ms 内必须响应"

RTOS:

cpp 复制代码
核心思想:高优先级任务必须立即执行

调度逻辑:
1. 任务有固定优先级(0~N,数字越大优先级越高)
2. 任何时候,只要高优先级任务就绪,立即抢占当前任务
3. 时间片轮转仅用于相同优先级的任务

优势:
- 紧急任务(如传感器中断)可微秒级响应
- 系统行为可预测,WCRT 可计算
场景 GPOS RTOS
任务 A(低优先级) 运行中,任务 B(高优先级) 就绪 A 可能继续运行完当前时间片(取决于调度器实现) B 立即抢占 A,延迟仅取决于中断响应 + 切换时间
两个同优先级任务 时间片轮转,公平分配 CPU 时间片轮转,但可配置为"协作式"(任务主动让出)
时间片到期 强制切换,保证公平 仅在同优先级时切换,高优先级任务不受限制

2. MPU (内存保护单元)

2.1 概念

核心目标:在资源受限的嵌入式系统中,提供轻量级的内存访问保护与区域管理

MPU 是一种硬件单元,用于定义和管理多个内存区域 (Regions),每个区域可独立配置:访问权限、缓存策略、执行权限等。

2.2 工作原理

每个 MPU Region 通常包含以下配置字段:

字段 含义 典型取值
Base Address 区域起始地址 32B/1KB/1MB 对齐
Size 区域大小 2⁵B ~ 2³²B(2 的幂)
Enable 是否启用该区域 Enable / Disable
Access Permission 访问权限 Privileged/User + RW/R/O/NO
Execute Never (XN) 是否禁止执行 XN / Executable
Cache Policy 缓存策略 WT/WB/No-Cache/Shared
Subregion Disable 子区域屏蔽 8 个子区域,可单独禁用

2.3 作用

常用于 RTOS 中的任务隔离:

cpp 复制代码
RTOS + MPU 配置示例:
├── Region 0: 内核代码 (Flash, 只读, 可执行)
├── Region 1: 内核数据 (SRAM, 特权 RW)
├── Region 2: 任务 A 栈 (SRAM, 任务 A 可 RW, 其他禁止)
├── Region 3: 任务 B 栈 (SRAM, 任务 B 可 RW, 其他禁止)
├── Region 4: 共享外设 (Peripheral, 特权 RW, 用户只读)
└── Background: 未配置区域 → 触发 Fault(调试用)

效果:任务 A 栈溢出不会破坏任务 B 数据

3. MMU (内存管理单元)

3.1 概念

MMU 是位于CPU 与 物理内存总线 之间的硬件组件。它负责将 CPU 发出的逻辑/虚拟地址 (Virtual Address, VA) 转换为 物理地址 (Physical Address, PA) ,并在转换过程中检查访问权限

功能 说明
抽象层 让软件看到的内存是连续、独立、无限的(虚拟),隐藏物理内存的碎片与限制
隔离保护 进程间内存隔离,防止恶意/错误程序破坏系统或其他进程
内存超售 支持 Swap 交换,允许运行比物理 RAM 更大的程序

3.2 工作原理

3.2.1 地址转换流程

3.2.2 页表 (Page Table)

  • 作用: 存储 VA 到 PA 映射关系的数据库。
  • 结构: 通常多级结构(如 ARM 4 级页表,x86 4/5 级页表),节省内存开销。
  • 页表项 (PTE) 内容:
    • 物理页框号 (PFN)
    • 权限位 (R/W/X, User/Kernel)
    • 状态位 (Valid/Invalid, Dirty, Accessed)
    • 缓存属性 (Cacheable, Bufferable)

3.2.3 TLB (Translation Lookaside Buffer)

  • 定义: 页表的高速缓存(Cache for Page Table)。
  • 原因: 页表存储在内存中,每次访问都查内存太慢(需多次内存访问)。TLB 将常用映射存在 CPU 内部寄存器/SRAM 中。
  • 性能影响:
    • TLB Hit: 1 个时钟周期完成转换。
    • TLB Miss: 需访问内存查页表,耗时数十~数百周期。
    • TLB Flush: 进程切换时,若地址空间不同,需清空 TLB 防止错用映射(开销大)。

3.2.4 缺页异常 (Page Fault)

  • 触发条件: MMU 查页表发现某虚拟页标记为"无效"(不在物理内存中)。
  • 处理流程:
    1. CPU trap 到内核态。
    2. 操作系统判断原因(非法访问 vs 合法缺页)。
    3. 若合法:分配物理页,从磁盘 (Swap) 加载数据,更新页表。
    4. 重试指令。
  • 意义: 实现按需分页 (Demand Paging)虚拟内存交换 的核心机制。

3.3 核心功能与作用

3.3.1 虚拟内存管理 (Virtual Memory)

  • 连续假象: 程序认为内存从 0 开始连续,物理内存可以是碎片化的。
  • 内存超售: 虚拟地址空间总和 >> 物理 RAM 大小(依赖磁盘 Swap)。
  • 按需加载: 程序启动时不加载全部代码/数据,访问到哪加载到哪。

3.3.2 内存保护 (Memory Protection)

  • 权限控制: 每个页可独立设置 读/写/执行 (RWX)。
    • 代码段:R + X (禁止写,防篡改)
    • 数据段:R + W (禁止执行,防注入)
    • 内核空间:特权级访问 (用户态访问触发 Fault)
  • 进程隔离: 进程 A 无法访问进程 B 的虚拟地址(页表不同)。

3.3.3 缓存策略控制 (Cache Policy)

  • MMU 页表项中可指定每个页的缓存属性:
    • Write-Back: 写回模式(高性能,数据可能暂存 Cache)
    • Write-Through: 直写模式(数据一致性高)
    • Uncacheable: 不缓存(用于内存映射 I/O,如寄存器)
  • 优势: 比全局缓存控制更精细,适合混合用途内存。

3.3.4 高级内存特性支持

  • Copy-on-Write (CoW): fork() 时父子进程共享物理页,仅当写入时才复制。极大提升进程创建效率。
  • 内存映射文件 (mmap): 将文件直接映射到虚拟地址空间,零拷贝 I/O。
  • 共享内存: 多个进程映射到同一物理页,实现高效 IPC。
相关推荐
岱宗夫up1 小时前
【前端基础】HTML + CSS + JavaScript 基础(三)
开发语言·前端·javascript·css·html
蜜獾云1 小时前
JAVA面试题速记-redis知识点
java·开发语言·redis
lly2024061 小时前
Vue3 目录结构
开发语言
m0_531237171 小时前
C语言-指针进阶
c语言·开发语言
Java后端的Ai之路1 小时前
在一个 Python 脚本中导入另一个脚本的功能
服务器·开发语言·python
W133309089072 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
三无少女指南2 小时前
开发者环境配置最佳实践:编辑器Cursor ,VS Code的上位体验实现 AI 与 WSL 联动
运维·c语言·数据库·windows·git·编辑器
kyle~2 小时前
Python---watchdog文件系统监控库
开发语言·python·操作系统·文件系统
开开心心就好2 小时前
文字转语音无字数限,对接微软接口比付费爽
java·linux·开发语言·人工智能·pdf·语音识别