tags: [source-summary] type: source source: "跨学科知识对应关系-结合详解" author: "AI助手" date: 2026-09-19
graph TD
subgraph 硬件层
A["PN结<br/>单向导电"] --> B["MOS管<br/>电压控制开关"]
B --> C["CMOS逻辑门<br/>与非门、或非门"]
C --> D["触发器<br/>存储1位"]
D --> E["寄存器<br/>存储N位"]
E --> F["ALU<br/>算术逻辑运算"]
F --> G["CPU<br/>取指译码执行"]
end
subgraph 硬件支撑
G --> H["时钟<br/>节拍器"]
G --> I["中断控制器<br/>GIC"]
G --> J["MMU<br/>地址翻译"]
end
subgraph FreeRTOS
H --> K["SysTick<br/>调度器心跳"]
I --> L["PendSV<br/>上下文切换"]
J -.->|无MMU| M["FreeRTOS<br/>无进程隔离"]
end
subgraph Linux
H --> N["定时器中断<br/>scheduler_tick"]
I --> O["中断上下文/软中断<br/>下半部处理"]
J --> P["虚拟内存<br/>进程隔离+COW"]
end
核心洞察:每一层都是上一层的"为什么",每一层都是下一层的"怎么做到的"。这不是概念罗列,而是物理到软件的因果链。
同一个"保存/恢复执行现场"的动作,在不同层面有不同的名字和实现:
| 层面 | 保存什么 | 保存到哪 | 触发机制 | 对应raw资料 |
|---|---|---|---|---|
| 数电 | 触发器状态(Q/Q') | 触发器内部 | 时钟沿 | 数电05-触发器 |
| CPU | R4-R11, SP, PC, xPSR | 任务栈 | PendSV中断 | ARM架构01 |
| FreeRTOS | 完整寄存器组 | TCB指向的栈 | PendSV | FreeRTOS 02-任务调度 |
| Linux | 完整寄存器组 | task_struct.thread.sp | schedule() | Linux内核04 |
为什么是同一套逻辑:
触发器存1位 → N个触发器并联存N位(寄存器) → 上下文切换保存N个寄存器
→ 保存到栈(也是寄存器的集合) → 栈指针存在TCB/task_struct中
每个"保存"动作都是把当前状态写入存储设备,以后能读回来恢复。区别只是存储设备的级别:触发器→寄存器→SRAM→DRAM。
| 层面 | 中断是什么 | 硬件支持 | 软件处理 | raw资料 |
|---|---|---|---|---|
| 模电 | 电平跳变 | 比较器检测 | 无 | 模电01 |
| 数电 | 中断信号线 | 中断控制器(GIC) | 中断向量表跳转 | 数电10 |
| CPU | 异常/中断向量 | NVIC/GIC-400 | 保存PC→跳转→恢复 | ARM架构01 |
| FreeRTOS | PendSV/SysTick | ARM Cortex-M | ISR→调度器→任务切换 | FreeRTOS 02 |
| Linux | IRQ/softirq/tasklet | GIC + 内核框架 | 上半部+下半部 | 驱动03-05 |
关键设计差异的原因:
FreeRTOS的中断处理很简单:ISR只做通知(Give/Send),切换推迟到PendSV。
Linux的中断处理很复杂:因为要处理多CPU并发、网络高吞吐、磁盘I/O等场景,所以分了五种下半部机制。
为什么这样设计:嵌入式MCU只有一个CPU、几个中断源,简单就够了;Linux跑在多核服务器上、处理每秒百万级中断,必须分层。
| 层面 | 管理什么 | 数据结构 | 解决什么问题 | raw资料 |
|---|---|---|---|---|
| 模电 | SRAM/DRAM存储单元 | 电容/触发器 | 存储1位/1位 | 模电01,05 |
| CPU | Cache (L1/L2/L3) | SRAM | CPU和内存速度差 | 组成原理05 |
| CPU | TLB | 缓存页表项 | 页表翻译太慢 | ARM架构01 |
| Linux | 虚拟内存 | 页表+VMA | 进程隔离、COW | Linux内核04 |
| Linux | 物理内存 | 伙伴系统 | 外部碎片 | Linux内核04 |
| Linux | 小对象 | slab | 内部碎片+分配速度 | Linux内核04 |
| FreeRTOS | 堆内存 | heap_1~5 | 嵌入式场景适配 | FreeRTOS 16 |
FreeRTOS没有MMU意味着什么:
这是设计取舍,不是缺陷:FreeRTOS面向资源受限的MCU(64KB RAM),MMU需要额外的硬件和内存开销,MCU承担不起。
| 维度 | FreeRTOS | Linux | 差异原因 |
|---|---|---|---|
| 有无MMU | 无 | 有 | MCU没有MMU硬件 |
| 调度器 | 位图+O(1)查找 | CFS红黑树+vruntime | 任务数少(几十) vs 进程数多(几千) |
| 内存管理 | heap_1~5 | 伙伴系统+slab | 资源受限 vs 通用 |
| 中断处理 | ISR+PendSV | 上半部+五种下半部 | 中断源少 vs 中断源多 |
| IPC | 队列/信号量/通知 | 管道/共享内存/socket | 简单通信 vs 复杂通信 |
| 内存保护 | 无 | 有(Copy-on-Write) | 无MMU → 无页保护 |
| 代码规模 | 几万行 | 几千万行 | 功能范围不同 |
核心差异的根本原因:
但核心思想是相同的:
类比:FreeRTOS像自行车——结构简单、轻便、一个人骑。Linux像汽车——结构复杂、重型、能载很多人。两者的发动机、传动系统、制动系统原理类似,但复杂度和功能范围完全不同。
graph TD
A["起点:数电模电"] --> B["PN结/三极管/MOS管"]
B --> C["触发器/寄存器"]
C --> D["ALU/CPU"]
D --> E["选择分支"]
E -->|嵌入式方向| F["FreeRTOS"]
E -->|系统方向| G["Linux内核"]
F --> H["任务/调度/IPC"]
F --> I["和Linux对比"]
G --> J["进程/调度/内存管理"]
G --> K["驱动/中断处理"]
H --> L["综合理解"]
I --> L
J --> L
K --> L
建议:先理解硬件基础(文件01),再选一个方向深入(FreeRTOS或Linux),最后通过对比理解两者的异同(文件06)。
来源:综合所有raw资料