@@ -294,7 +294,7 @@ backgroundColor: white
294
294
##### 通过CSR寄存器实现的隔离
295
295
OS通过硬件隔离手段(三防)来保障计算机的安全可靠
296
296
- 设置 CSR(控制状态寄存器) 实现隔离
297
- - 权力 :防止应用访问系统管控相关寄存器
297
+ - 控制 :防止应用访问系统管控相关寄存器
298
298
- ** 地址空间控制** 寄存器:mstatus/sstatus CSR(中断及状态)
299
299
- 时间:防止应用长期使用 100%的 CPU
300
300
- ** 中断配置** 寄存器:sstatus/stvec CSR(中断跳转地址)
@@ -794,13 +794,13 @@ scause 寄存器
794
794
795
795
796
796
---
797
- ##### mtvec & stvec 寄存器
797
+ ##### stvec 寄存器
798
798
中断/异常向量(trap-vector)基地址寄存器stvec CSR用于配置** trap_handler地址**
799
799
- 包括向量基址(BASE)和向量模式(MODE):BASE 域中的值按 4 字节对齐
800
800
- MODE = 0 表示一个trap_handler处理所有的中断/异常
801
801
- MODE = 1 表示每个中断/异常有一个对应的trap_handler
802
802
803
- mtvec & stvec 寄存器
803
+ stvec 寄存器
804
804
![ w:1000] ( figs/rv-tvec.png )
805
805
806
806
@@ -921,6 +921,19 @@ ASID 减少了 TLB 刷新需求
921
921
922
922
频繁的 TLB 刷新会导致显著的性能开销。这是因为新的内存访问将无法命中已缓存的 TLB 条目,导致更多时间花费在查找和加载新的映射上。
923
923
-->
924
+ ---
925
+ ##### S-Mode虚存机制
926
+ RISC-V 64 支持以下 ** 虚拟地址转换方案** :
927
+
928
+ | ** 模式** | ** 虚拟地址位宽** | ** 页表级数** | ** 每级索引位数** | ** 物理地址位宽** |
929
+ | --- | --- | --- | --- | --- |
930
+ | ** Sv39** | 39 位 | 3 级 | 9-9-9 | 56 位 |
931
+ | ** Sv48** | 48 位 | 4 级 | 9-9-9-9 | 56 位 |
932
+ | ** Sv57** | 57 位 | 5 级 | 9-9-9-9-9 | 56 位 |
933
+
934
+ ** 注意** :不同的模式仅影响 ** 虚拟地址的解析** ,物理地址仍然受处理器实现的物理地址宽度(通常为 ** 56 位** )
935
+
936
+
924
937
---
925
938
##### S-Mode虚存机制
926
939
@@ -932,20 +945,117 @@ ASID 减少了 TLB 刷新需求
932
945
933
946
---
934
947
##### S-Mode虚存的地址转换
935
- S、U-Mode中虚拟地址会以从根部遍历页表的方式转换为物理地址:
936
948
937
- - satp.PPN 给出了** 一级页表基址** , VA [ 31:22] 给出了一级页号,CPU会读取位于地址(satp. PPN × 4096 + VA[ 31: 22] × 4)页表项。
938
- - PTE 包含** 二级页表基址** ,VA[ 21:12] 给出了二级页号,CPU读取位于地址(PTE. PPN × 4096 + VA[ 21: 12] × 4)叶节点页表项。
939
- - ** 叶节点页表项的PPN字段** 和页内偏移(原始虚址的最低 12 个有效位)组成了最终结果:物理地址(LeafPTE.PPN×4096+VA[ 11: 0] )
949
+ ```
950
+ 38 30 29 21 20 12 11 0
951
+ +------------+------------+------------+------------- +
952
+ | VPN[2] | VPN[1] | VPN[0] | Page Offset |
953
+ +------------+------------+------------+------------- +
954
+ 9 bits 9 bits 9 bits 12 bits
955
+ ```
940
956
957
+ - VPN[ 2] , VPN[ 1] , VPN[ 0] (共 27 位):L2/1/0三级页表索引。
958
+ - Page Offset(12 位):页内偏移(4 KiB 页大小)。
941
959
942
960
---
943
961
##### S-Mode虚存的地址转换
962
+ (1) 读取 satp CSR
963
+ - satp.PPN 给出了** L2页表基地址的 物理页号(Physical Page Number, PPN)。**
964
+ - satp.MODE(4 bits):8(Sv39)、9(Sv48)、10(Sv57)。
965
+ ```
966
+ L2页表基地址 = PPN × 4 KiB
967
+ ```
968
+ ---
969
+ ##### S-Mode虚存的地址转换
970
+ (2) 解析 VPN(Virtual Page Number)
971
+ 根据虚拟地址提取 VPN[ 2] , VPN[ 1] , VPN[ 0] ,并进行 3 级页表查询。
972
+ 每个页表项(PTE,Page Table Entry)大小为 64-bit,其结构如下:
973
+ ```
974
+ 63 10 9 8 7 6 5 4 3 2 1 0
975
+ +---------------+-----+---+------------ +
976
+ | PPN (44 bits) | RSW | D | A | X W R V |
977
+ +---------------+-----+---+------------ +
944
978
945
- ![ w:650] ( figs/satp2.png )
979
+ ```
980
+ - PPN(物理页号):映射到下一级页表或最终物理页。V(Valid):有效位,1 表示 PTE 有效。R/W/X(读/写/执行):页的权限。A/D(Access/Dirty):访问和修改位。
981
+
982
+ ---
983
+ ##### S-Mode虚存的地址转换
984
+ 三级地址翻译步骤:
985
+ 1 . VPN[ 2] = VA [ 38:30] , 给出了L2页表的索引号
986
+ ```
987
+ L2页表的页表项(L2-PTE)地址= (satp.PPN × 4 KiB) + (VPN[2] × 8)
988
+ L2-PTE.PPN = L1页表基址的物理页号
989
+
990
+ 63 10 9 8 7 6 5 4 3 2 1 0
991
+ +---------------+-----+---+------------ +
992
+ | PPN (44 bits) | RSW | D | A | X W R V |
993
+ +---------------+-----+---+------------ +
994
+
995
+ ```
996
+ ---
997
+ ##### S-Mode虚存的地址转换
998
+ 三级地址翻译步骤:
999
+ 2 . VPN[ 1] = VA [ 29:21] , 给出了L1页表的索引号
1000
+ ```
1001
+ L1页表的页表项(L1-PTE)地址= (L2-PTE.PPN × 4 KiB) + (VPN[1] × 8)
1002
+ L1-PTE.PPN = L0页表基址的物理页号
1003
+
1004
+ 63 10 9 8 7 6 5 4 3 2 1 0
1005
+ +---------------+-----+---+------------ +
1006
+ | PPN (44 bits) | RSW | D | A | X W R V |
1007
+ +---------------+-----+---+------------ +
1008
+
1009
+ ```
1010
+ ---
1011
+ ##### S-Mode虚存的地址转换
1012
+ 三级地址翻译步骤:
1013
+ 3 . VPN[ 0] = VA [ 20:12] , 给出了L0页表的索引号
1014
+ ```
1015
+ L0页表的页表项(L0-PTE)地址= (L1-PTE.PPN × 4 KiB) + (VPN[1] × 8)
1016
+ L0-PTE.PPN = 最终物理地址的物理页号
1017
+
1018
+ 63 10 9 8 7 6 5 4 3 2 1 0
1019
+ +---------------+-----+---+------------ +
1020
+ | PPN (44 bits) | RSW | D | A | X W R V |
1021
+ +---------------+-----+---+------------ +
1022
+
1023
+ ```
946
1024
1025
+ ---
1026
+ ##### S-Mode虚存的地址转换
1027
+ 4 . 计算物理地址
1028
+ ```
1029
+ 虚地址对应的最终物理地址 = (L0 PTE.PPN × 4 KiB) + Page Offset
1030
+ ```
1031
+ 假设: satp.PPN = 0x12345,
1032
+ 即L2页表基地址 = 0x12345 × 4 KiB = 0x12345000。
947
1033
1034
+ 虚拟地址: 0x1234_5678
1035
+ VPN[ 2] = 0x091(9 bits)
1036
+ VPN[ 1] = 0x234(9 bits)
1037
+ VPN[ 0] = 0x567(9 bits)
1038
+ Page Offset = 0x078
1039
+
1040
+ ---
1041
+ ##### S-Mode虚存的地址转换
1042
+ 4 . 计算物理地址
1043
+ - 经过三级页表查询:
1044
+ - L2 PTE 指向 L1 页表(PPN = 0x20000)。
1045
+ - L1 PTE 指向 L0 页表(PPN = 0x30000)。
1046
+ - L0 PTE 指向物理页(PPN = 0x40000)。
1047
+
1048
+ 最终 物理地址计算:
1049
+ ```
1050
+ 物理地址 = (0x40000 × 4 KiB) + 0x078
1051
+ = 0x40000000 + 0x078
1052
+ = 0x40000078
1053
+ ```
948
1054
<!-- ---
1055
+ 
1056
+
1057
+
1058
+
949
1059
## RISC-V 系统编程:S-Mode下的隔离
950
1060
- S-Mode比 U-Mode权限更高,但是比 M-Mode权限低
951
1061
- S-Mode下运行的软件不能使用 M-Mode的 CSR 和指令,并受到 PMP 的限制
@@ -961,4 +1071,5 @@ S、U-Mode中虚拟地址会以从根部遍历页表的方式转换为物理地
961
1071
- 了解 RISC-V 的 M-Mode 和 S-Mode 的基本特征
962
1072
- 了解OS在 M-Mode 和 S-Mode 下如何访问控制计算机系统
963
1073
- 了解不同软件如何在 M-Mode<–>S-Mode<–>U-Mode 之间进行切换
1074
+ - 了解虚实地址转换
964
1075
0 commit comments