简略版:
stateDiagram-v2
state if_state <>
CPU产生VA --> 访问TLB
访问TLB --> 转VA并访问Cache: 命中
访问TLB --> 访问页表: 缺失
访问页表 --> 转VA并访问Cache: 命中
访问页表 --> 缺页处理: 缺失
缺页处理 --> 访问TLB: 重新执行
转VA并访问Cache --> 读取Cache数据: 命中
转VA并访问Cache --> 访问内存数据: 缺失
完整版:(注意,TLB和Cache是组相联的)
stateDiagram-v2
state if_state <>
CPU产生VA(VA=页号+页内偏移量) --> 访问PTR
访问PTR --> 访问TLB(页号=TLB标记+TLB组号): 页号 < 页表长度
访问PTR --> 越界中断: 页号 ≥ 页表长度
访问TLB(页号=TLB标记+TLB组号) --> 访问页表(页表项PA=页表起始地址+页号×页表项长度): 缺失,访问PTR
访问TLB(页号=TLB标记+TLB组号) --> 读取页框号: 命中
访问页表(页表项PA=页表起始地址+页号×页表项长度) --> 缺页中断处理:缺失
访问页表(页表项PA=页表起始地址+页号×页表项长度) --> 读取页框号,修改TLB:命中
state 缺页中断处理{
[*] --> 外存找到缺页
外存找到缺页 --> 内存是否已满
内存是否已满 --> 页面置换: 是
内存是否已满 --> 该页换入内存: 否
页面置换 --> 该页换入内存
该页换入内存 --> 修改页表
state 页面置换{
[*] --> 选择一页换出
选择一页换出 --> 该页是否被修改过
该页是否被修改过 --> 该页写入外存:是
该页是否被修改过 --> [*]:否
该页写入外存 --> [*]
}
修改页表 --> [*]
}
缺页中断处理 --> 读取页框号,修改TLB
读取页框号 --> CPU获得PA(PA=页框号+页内偏移量)
读取页框号,修改TLB --> CPU获得PA(PA=页框号+页内偏移量)
读取页框号,修改TLB --> 访问TLB(页号=TLB标记+TLB组号)
CPU获得PA(PA=页框号+页内偏移量) --> 访问Cache(PA=Cache标记+Cache组号+块内偏移量)
访问Cache(PA=Cache标记+Cache组号+块内偏移量)--> 读取数据: 命中
访问Cache(PA=Cache标记+Cache组号+块内偏移量)--> 访问内存: 缺失
访问内存 --> 读取数据