0925 上午10.50 视频1.40.00开始
下午14:00开始
MMU
骗
cpu内部架构
MMU开一个进程需要4G,但实际MMU不会开4G,只会开一个合适的大小,所以可以同时运行很多程序
处理器内部架构
在 ARM 处理器中,PC
(程序计数器)指针的值是处理器执行指令的核心之一,可以说它在指令的取指、解码、执行等过程中起到了至关重要的作用。下面详细解释 PC
指针的作用与处理器流水线的关联。
PC 指针的工作原理
-
取指(Fetch):
- 在取指阶段,处理器从
PC
指向的地址读取指令。PC
指向当前要执行的指令的内存地址,并将这一指令从内存中读取到指令寄存器中。 - 由于 ARM 指令是固定大小的(大多数情况下为 4 字节),所以每次取指时
PC
的值会加上 4(在某些特殊情况下如 Thumb 模式可能会有所不同)。
- 在取指阶段,处理器从
-
解码(Decode):
- 在解码阶段,处理器解析刚刚取出的指令,确定需要执行的操作和参与的寄存器等信息。
- 解码阶段虽然不直接改变
PC
的值,但它为处理器后续的执行阶段提供了必要的信息。
-
执行(Execute):
- 在执行阶段,处理器根据解码结果进行相应的计算或操作,如寄存器间的加法、逻辑运算等。
- 执行完成后,若为跳转指令(例如条件跳转、无条件跳转等),则会修改
PC
的值以指向跳转后的地址。
PC 与 流水线的关系
在现代 ARM 处理器中,流水线技术得到了广泛应用,通常分为几个阶段,例如取指、解码、执行、访存和写回。流水线的设计允许多个指令并行处理,从而提高处理器的整体性能。
-
流水线结构:
- 在流水线结构中,多个指令可以在不同阶段同时进行。例如,第一条指令在取指阶段,第二条指令在解码阶段,第三条指令在执行阶段,依此类推。例如:
- Cycle 1: 取指指令1
- Cycle 2: 取指指令2,解码指令1
- Cycle 3: 取指指令3,解码指令2,执行指令1
- …
- 在流水线结构中,多个指令可以在不同阶段同时进行。例如,第一条指令在取指阶段,第二条指令在解码阶段,第三条指令在执行阶段,依此类推。例如:
-
PC 的实时更新:
PC
通常会在取指阶段被更新。因为它在每次取指时会自动加上指令的宽度(如 4 字节),顺序执行。- 但是在跳转指令出现时,
PC
的更新会变得复杂,可能需要在解码或执行阶段更新,这会涉及到分支预测等技术,以减少因跳转带来的流水线冒险(Stall)。
流水线冒险
流水线中的“冒险”问题指的是指令在不同阶段之间的依赖关系,主要有:
- 结构冒险:由于硬件资源不足而导致的冲突。
- 数据冒险:指令之间依赖导致的数据读取/写入冲突。
- 控制冒险:因分支指令导致的流水线需要多清空和重新加载指令的问题。
为了减少控制冒险,现代处理器使用分支预测技术和延迟槽等技术来优化 PC
的调整和指令的顺序执行。
总结
PC
在 ARM 处理器中起到了指向当前执行指令地址的作用。PC
的取指、解码、执行等过程是紧密联系在一起的,形成了处理器指令执行的基本循环。- 流水线设计允许指令在多个阶段并行处理,提高了处理器的效率,但也引入了冒险问题,需要通过结构设计和控制策略来解决。
流水线(洗切炒)
在 ARM 架构中,SP
(堆栈指针)、LR
(链接寄存器)和 PC
(程序计数器)是重要的寄存器,分别用于不同的目的。下面详细解释这些寄存器的功能和 SP
指向的位置。
1. SP(堆栈指针)
- 定义:
SP
是堆栈指针,指向当前堆栈的顶部。在 ARM 架构中,堆栈通常向下增长,即每次压入数据,SP
的值会降低。 - 用途:
SP
用于管理函数调用和局部变量的存储。当一个函数被调用时,会在堆栈上分配空间,用于存储局部变量、传递参数、保存返回地址等。- 当使用
stmfd sp!, {...}
和ldmfd sp!, {...}
等指令保存和恢复寄存器状态时,SP
的值会自动变化,以确保堆栈的完整性。
2. LR(链接寄存器)
- 定义:
LR
是链接寄存器,用于保存函数调用后的返回地址。当一个函数被调用时,返回地址会被自动保存到LR
中。 - 用途:
- 在调用其他函数时,
LR
会被自动更新,便于函数返回到正确的位置。通常在函数结束时,使用bx lr
指令返回到保存在LR
中的地址。
- 在调用其他函数时,
3. PC(程序计数器)
- 定义:
PC
是程序计数器,保存当前正在执行的指令地址。在 ARM 中,PC
的值通常表示当前指令的地址加上额外的偏移(通常为 8,因为 ARM 指令的取指流水线机制)。 - 用途:
PC
用于跟踪程序的执行流程。当程序执行一条指令时,PC
自动增加,以指向下一条指令。当遇到跳转、分支或中断时,PC
会相应地被更改,以指向新的执行地址。
堆栈的结构
-
堆栈增长方向:在 ARM 体系结构中,堆栈向下增长。也就是说,当向堆栈中压入数据时,堆栈指针(
SP
)的值会减少。 -
示例:在一个函数调用中,可能会有以下过程:
push {r0, r1, r2} ; 将寄存器 r0, r1, r2 的值压入堆栈
上述指令会将
SP
的值减少,并在新的堆栈位置存储r0
、r1
和r2
的值。
总结
SP
:堆栈指针,指向当前堆栈的顶部位置,它用于管理堆栈中的数据,如局部变量和返回地址。LR
:链接寄存器,保存返回地址,用于函数调用和返回。PC
:程序计数器,指向当前执行指令的地址,自动更新以指向下一条指令。
cpu执行的工作模式
cpu多种身份下工作
异常情况的处理
汇编
cmp
类似于if判断
sp指向栈指针
lr指针指向下一步
pc指向当前执行的下下步
存大数据
初始化栈
工作模式变化后 栈会清0
异常后会跳转到对应地址
spsr拷贝cpsr 返回刚刚的模式
[r0]代表取r0存放内容地址的值,类似于*p
MRS/MSR
汇编代码