tags: [source-summary] type: source source: "微机原理与操作系统硬件基础-原理与本质" author: "AI助手" date: 2026-09-19
CPU内部是怎么组织的?操作系统需要什么样的硬件支持才能运行?
初学者常有的困惑:
读完本文,你能理解:
用生活理解:CPU就像一个微型工厂——ALU是车间(干活),寄存器是工位(临时放东西),控制器是调度室(指挥),PC是工序表(记着下一步干什么)。
+-----------------------------------------+
| CPU |
| |
| +------------------------------------+ |
| | 寄存器组(Registers) | |
| | R0 R1 R2 ... R15 (通用寄存器) | |
| | SP(R13) LR(R14) PC(R15) | |
| | CPSR (状态寄存器) | |
| +------------------------------------+ |
| | |
| +-------------+ +-----------------+ |
| | ALU | | 控制单元 | |
| | 运算部件 | | 取指/译码/控制 | |
| +-------------+ +-----------------+ |
+-----------------------------------------+
ARM Cortex-A7有16个32位通用寄存器(R0-R15):
| 寄存器 | 别名 | 用途 | 操作系统中的角色 |
|---|---|---|---|
| R0-R12 | - | 通用数据 | 函数参数/返回值/临时变量 |
| R13 | SP | 栈指针 | 每个任务/进程有自己的栈 |
| R14 | LR | 链接寄存器 | 函数调用返回地址 |
| R15 | PC | 程序计数器 | 指向当前执行的指令 |
| CPSR | - | 状态寄存器 | 中断使能/禁止、模式切换 |
关键理解:
pxTopOfStack指向的就是这个栈指针task_struct中也有保存这些寄存器的字段操作系统的关联:
用生活理解:总线就像"公路系统"——地址总线是"门牌号",数据总线是"车道",控制总线是"红绿灯"。
| 总线类型 | 方向 | 作用 | 操作系统关联 |
|---|---|---|---|
| 地址总线 | CPU → 设备 | 指定要访问的内存/IO地址 | 内存映射、设备寄存器访问 |
| 数据总线 | 双向 | 传输数据 | 内存读写、设备通信 |
| 控制总线 | CPU → 设备 | 读/写/中断等控制信号 | 系统调用、中断响应 |
关键概念:在ARM架构中,外设寄存器被映射到和内存相同的地址空间
地址空间:
0x00000000 ┌──────────────┐
│ Flash/ROM │ ← 启动代码
0x20000000 ├──────────────┤
│ RAM │ ← 运行时数据
0x40000000 ├──────────────┤
│ 外设寄存器 │ ← GPIO、UART、定时器等
0xE0000000 ├──────────────┤
│ 中断控制器 │ ← GIC-400
0xFFFF0000 ├──────────────┤
│ 中断向量表 │ ← 异常处理入口
└──────────────┘
操作系统的关联:
ioremap()将物理地址映射到虚拟地址用生活理解:中断就像"门铃"——CPU在忙自己的事,外设按门铃(发中断),CPU停下来去开门(处理中断),处理完继续忙自己的事。
中断的完整流程:
1. 外设产生中断信号
↓
2. 中断控制器(GIC-400)收集和优先级排序
↓
3. 中断控制器向CPU发送IRQ/FIQ信号
↓
4. CPU检测到中断:
a. 完成当前指令
b. 保存当前上下文(R0-R15, CPSR)到栈
c. 切换到中断模式(CPSR中的模式位变化)
d. 跳转到中断向量表中的处理程序
↓
5. 执行中断处理程序(ISR)
↓
6. 中断返回:恢复上下文,继续执行被中断的任务
ARM Cortex-A7使用GIC-400(Generic Interrupt Controller)管理中断:
+------------------+
| GIC-400 |
| |
| Distributor ←── 所有中断源(SPI、PPI、SGI)
| ↓ |
| CPU Interface ←── 优先级判断、屏蔽
| ↓ |
| CPU0 IRQ/FIQ │
+------------------+
中断类型:
| 类型 | 全称 | 说明 | 操作系统用途 |
|---|---|---|---|
| SGI | Software Generated Interrupt | 软件触发,核间通信 | 多核调度、IPI |
| PPI | Private Peripheral Interrupt | 每核私有(如定时器) | SysTick时钟中断 |
| SPI | Shared Peripheral Interrupt | 所有核共享 | 设备中断(UART、GPIO等) |
关键理解:
| 硬件中断概念 | Linux实现 | FreeRTOS实现 |
|---|---|---|
| 中断向量表 | arch/arm/kernel/entry-armv.S | startup_stm32.s(启动文件) |
| 中断控制器驱动 | drivers/irqchip/irq-gic.c | stm32 HAL库NVIC配置 |
| 时钟中断 | tick_interrupt → scheduler_tick() | SysTick_Handler → xPortSysTickHandler() |
| 设备中断 | request_irq()注册ISR | HAL_NVIC_SetPriority() + ISR |
| 中断下半部 | softirq/tasklet/workqueue | 任务通知(轻量级) |
| 中断嵌套 | 支持(CONFIG_PREEMPT) | 可配置(configKERNEL_INTERRUPT_PRIORITY) |
用生活理解:MMU就像"翻译官"——程序说"我要访问地址0x1000",MMU翻译成"实际上是物理地址0x5000",程序完全不知道真实的物理地址。
MMU的核心功能:
ARM Cortex-A7的MMU:
虚拟地址(32位):
+--------+--------+--------+
| L1索引 | L2索引 | 页内偏移 |
| 12位 | 8位 | 12位 |
+--------+--------+--------+
↓ ↓
+-------+ +-------+
| L1页表 |→ | L2页表 |→ 物理地址
|(16KB) | |(1KB) |
+-------+ +-------+
L1页表项(1MB段描述符):
+--+--+--+--+--+--+--+--+
|NS|00|Domain|1|C|B|1|物理地址[31:20]
+--+--+--+--+--+--+--+--+
L2页表项(4KB页描述符):
+--+--+--+--+--+--+--+--+
|0|nG|S|AP[2:1]|TEX[2:0]|AP[0]|C|B|1|物理地址[31:12]
+--+--+--+--+--+--+--+--+
关键理解:
CPU发出虚拟地址
↓
查TLB(几ns)
↓
TLB命中?──→ 是 ──→ 直接得到物理地址
↓ 否
查L1/L2页表(几十ns)
↓
得到物理地址,更新TLB
操作系统的关联:
flush_tlb_mm())| 模式 | 用途 | 寄存器 | 操作系统关联 |
|---|---|---|---|
| User | 用户程序 | R0-R15 | 应用程序运行 |
| FIQ | 快速中断 | R8-R15(私有) | 高速数据传输 |
| IRQ | 普通中断 | R13_irq, R14_irq(私有) | 一般中断处理 |
| Supervisor | 管理模式 | R13_svc, R14_svc(私有) | 系统调用、内核启动 |
| Abort | 数据异常 | R13_abt, R14_abt(私有) | 内存访问异常 |
| Undef | 未定义指令 | R13_und, R14_und(私有) | 非法指令 |
| System | 系统模式 | 与User相同 | Linux内核运行 |
关键理解:
应用程序(User模式)
↓ 系统调用 (SVC指令)
内核代码(Supervisor模式)
↓ 中断发生
中断处理(IRQ模式)
↓ PendSV(FreeRTOS)/ 进程调度(Linux)
上下文切换
↓
新任务/进程(User模式)
原因:
FreeRTOS利用这一点:
原因:
FreeRTOS为什么不用MMU:
原因:
FreeRTOS的利用:
configMAX_SYSCALL_INTERRUPT_PRIORITY以上的中断不受FreeRTOS管理| 硬件概念 | 数电模电 | 操作系统理论 | Linux实现 | FreeRTOS实现 |
|---|---|---|---|---|
| 寄存器 | 触发器组 | PCB中的上下文 | task_struct.thread | TCB中的栈指针 |
| 程序计数器(PC) | 计数器 | 进程状态 | thread.pc | 栈顶保存的PC |
| 总线 | 数据通路 | 设备管理 | ioremap/MMIO | 直接寄存器访问 |
| 中断控制器 | 组合逻辑 | 中断处理 | GIC驱动 | NVIC配置 |
| MMU | - | 虚拟内存 | 页表/TLB | 不使用(无MMU) |
| CPU模式 | 0 | 特权级/保护域 | 内核态/用户态 | Handler/User模式 |
| 时钟 | 时钟信号 | 时钟中断/tick | tick_interrupt | SysTick_Handler |
误区:CPU就是一块芯片,和普通电路没什么关系 正解:CPU是极其复杂的时序逻辑电路,内部由数十亿个MOS管组成
误区:中断和操作系统是两个独立的东西 正解:中断是操作系统运行的硬件基础,没有中断就没有多任务调度
误区:虚拟内存只是"让内存变大" 正解:虚拟内存的核心是进程隔离和内存保护,"变大"只是副产品
误区:FreeRTOS和Linux用的硬件机制完全不同 正解:它们都利用相同的硬件(寄存器、中断、栈),只是使用深度不同
误区:上下文切换就是保存/恢复寄存器 正解:这只是硬件层面,操作系统还需要更新调度数据结构、刷新缓存等
答:
答:
答:
答:
答:
raw/Joplin/嵌入式+Linux/嵌入式Linux驱动开发实战/01-ARM架构与裸机编程/01-Cortex-A7架构详解.md — ARM架构详解raw/Joplin/嵌入式+Linux/嵌入式Linux驱动开发实战/02-嵌入式Linux内核基础/04-进程调度与中断管理.md — Linux进程调度与中断raw/Joplin/计算机专业基础/计算机组成原理/5.计算机中央处理器(CPU)_.md — CPU结构