简略版:
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=页表起始PA+页号×页表项长度): 缺失,访问PTR(获取页表起始PA) 访问TLB(页号=TLB标记+TLB组号) --> 读取页框号: 命中 访问页表(页表项PA=页表起始PA+页号×页表项长度) --> 缺页中断处理:缺失 访问页表(页表项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组号+块内偏移量)--> 访问内存: 缺失 访问内存 --> 读取数据 标签:操作系统,访问,--,Cache,内存,TLB,PA,页表,流程图 From: https://www.cnblogs.com/Mount256/p/17510980.html