WillOS 核心机理深度解析(第一章):驱动内核全舰的“动力引擎”

项目地址:WillOS/WillOS/Inc/allocator.h at master · LieWill/WillOS

返回总导读:关于我独立开发 RTOS 这一件事

欢迎来到 WillOS 核心机理深度解析系列。对于刚入门 RTOS 的开发者来说,理解“多任务”不应停留在概念层面,而应深入到 Cortex-M 硬件特性 与 汇编逻辑 之间的精妙协作。

在 WillOS 的四大模块中,我们选择从 contex.s(上下文切换)作为第一章,因为它是连接“并发逻辑”与“物理 CPU”的底层纽带。如果没有这一章的汇编魔法,后面所有的内存管理和任务调度都无法在硬件层面真正跑起来。


1. 物理纽带:为什么从“上下文切换”开始?

  • 调度器 (Scheduler) 只是一个决策者,它说:“现在该 A 跑了”。
  • 内存管理器 (Allocator) 只是一个后勤,它提供生存空间。
  • 上下文切换 (Context) 则是真正的搬运工,它负责把 CPU 内部的寄存器状态“瞬移”到内存中,再把另一个任务的状态搬回来。

理解了上下文切换,你就理解了任务是如何在物理世界中“存在”和“流转”的。


2. 核心机理:双栈指针与运行环境隔离

Cortex-M 架构通过硬件实现了两个栈指针:MSP (主栈) 和 PSP (进程栈)。这是 RTOS 稳定运行的基石。

2.1 环境隔离流转

  • Thread Mode(线程模式):所有用户任务在 PSP 下运行。它们拥有独立的内存空间。
  • Handler Mode(异常处理模式):所有的中断(SysTick, PendSV, 外设中断)统统在 MSP 下运行。

2.2 物理轨迹:switch_msp_to_psp 的意义

系统刚启动时一切都在 MSP 下。为了开启多任务,我们需要完成一次物理级的“脱壳”:

  1. 保存主环境现场:将 main 函数的栈状态交给 PSP。
  2. 重塑 MSP:将 MSP 指向专门分配给中断的静态内存(isr_stack)。
    机理效果:此后,无论发生多少次中断嵌套,中断的压力都在 MSP 上;而在任务调度时,调度器只需在不同的 PSP 之间切换。

3. 核心流程:PendSV 异步切换接力

WillOS 使用 PendSV(可悬起系统调用) 异常来执行切换。这是一种平滑、低延迟的设计方案。

3.1 硬件与软件的“交接棒”

  1. 逻辑触发:当调度器决定切换任务时,它通过写 ICSR 寄存器挂起一个 PendSV 标志。
  2. 异步等待:PendSV 被配置为 最低优先级。这意味着切换会等待所有紧急抢占的中断处理完成后才发生。
  3. 硬件自动入栈:当 CPU 准备处理 PendSV 时,硬件会自动把 8 个寄存器(R0-R3, R12, LR, PC, xPSR)压入当前的 PSP。
  4. 汇编手动入栈contex.s 接管后,手动压入剩余的 R4-R11(以及 FPU 浮点寄存器)。此时,任务的“灵魂”已在内存中全量存档。

4. 后续篇章导读

有了这个“心脏”在跳动,我们接下来的旅程将顺理成章:


小贴士:你可以将 contex.s 看作是 WillOS 的“底盘”。虽然它代码最少(约 100 行),但承载了整个系统与芯片硬件对话的最直接逻辑。

评论

  1. 咩咩
    1 周前
    2026-3-15 17:17:18

    你好

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇