@@ -46,6 +46,8 @@ backgroundColor: white
46
46
<!-- 主要说明x86, arm由于兼容性,历史原因,导致设计实现复杂,riscv简洁/灵活/可扩展,便于学习掌握并用于写OS -->
47
47
![ w:1150] ( figs/mainstream-isas.png )
48
48
49
+ <!-- “encoding”通常指的是指令编码(instruction encoding) 决定了指令的结构和执行方式-->
50
+
49
51
---
50
52
##### 主流CPU比较
51
53
* 由于兼容性和历史原因,导致x86和ARM的设计实现复杂
@@ -399,8 +401,9 @@ OS通过硬件隔离手段(三防)来保障计算机的安全可靠
399
401
- `` sret `` 监管者模式返回
400
402
- `` wfi `` 等待中断 (wait for interupt)
401
403
- `` sfence.vma `` 虚拟地址屏障(barrier)指令,用于虚拟内存无效和同步
402
- - <!-- 修改页表时,修改上下文时,刷新同步-->
403
-
404
+ <!-- 修改页表时,修改上下文时,刷新同步
405
+ 它确保在页表更新或进程切换后,CPU 不会使用过期的地址映射信息
406
+ -->
404
407
- 很多其他的系统管理功能通过读写控制状态寄存器来实现
405
408
406
409
注:`` fence.i `` 是i-cache屏障(barrier)指令,非特权指令,属于 “Zifencei”扩展规范,用于i-cache和d-cache一致性
@@ -840,18 +843,11 @@ mtvec & stvec 寄存器
840
843
---
841
844
##### S-Mode中断/异常的硬件响应
842
845
843
- ** 硬件执行内容**
844
-
845
- hart 接受了中断/异常,并需要委派给 S-Mode,那么硬件会原子性的经历下面的状态转换
846
+ ** 硬件执行内容** :hart 接受了中断/异常,并需要委派给 S-Mode,那么硬件会原子性的经历下面的状态转换
846
847
847
848
1 . ** 发生中断/异常的指令PC** 被存入 sepc, 且 PC 被设置为 stvec
848
849
2 . scause 设置中断/异常** 类型** ,stval被设置为出错的地址/异常** 相关信息**
849
850
3 . 把 sstatus中的 SIE 位置零,** 屏蔽中断** , ** SIE位之前的值** 被保存在 SPIE 位中
850
-
851
-
852
- ---
853
- ##### S-Mode中断/异常的硬件响应
854
-
855
851
4 . ** 发生例外前的特权模式** 被保存在 sstatus 的 SPP(previous privilege) 域,然后设置当前特权模式为S-Mode
856
852
5 . ** 跳转** 到stvec CSR设置的地址继续执行
857
853
@@ -914,6 +910,17 @@ hart 接受了中断/异常,并需要委派给 S-Mode,那么硬件会原子
914
910
- PPN 字段保存了** 根页表的物理页号**
915
911
![ w:900] ( figs/satp.png )
916
912
913
+ <!--
914
+ ASID 是一个唯一标识符,用于区分不同进程的虚拟地址空间。每个进程在使用其页表进行内存访问时都会有一个对应的 ASID。
915
+
916
+ ASID 使得 TLB 能够同时缓存多个进程的地址映射,而无需在每次上下文切换时清空整个 TLB。
917
+
918
+ ASID 减少了 TLB 刷新需求
919
+
920
+ 如果没有 ASID,每次进程上下文切换后,必须完全刷新 TLB,因为同一虚拟地址可能指向不同的物理地址。这是因为 TLB 缓存的是虚拟到物理地址的映射,没有额外的信息来区分不同进程的映射。
921
+
922
+ 频繁的 TLB 刷新会导致显著的性能开销。这是因为新的内存访问将无法命中已缓存的 TLB 条目,导致更多时间花费在查找和加载新的映射上。
923
+ -->
917
924
---
918
925
##### S-Mode虚存机制
919
926
0 commit comments