地址翻译流程图

简略版:

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已满?
Cache已满? --> 替换算法: 是
Cache已满? --> 写入新行: 否
替换算法 --> 读取数据
写入新行 --> 读取数据

一级分页存储系统

  • 字节编址
  • 一页为 4KB
  • 逻辑地址空间为 32 位(4GB)
  • 物理地址空间为 28 位(256MB)
  • 页表项长度为 4B
  • TLB为八路组相联,一共16行(组数=16/8=2)
  • Cache为四路组相联,一共16行(组数=16/4=4),Cache行大小为64B

二级分页存储系统

  • 字节编址
  • 一页为 4KB
  • 逻辑地址空间为 32 位(4GB)
  • 物理地址空间为 28 位(256MB)
  • 页表项长度为 4B
  • 规定页目录表只占一页
  • TLB为八路组相联,一共16行(组数=16/8=2)
  • Cache为四路组相联,一共16行(组数=16/4=4),Cache行大小为64B