虚拟地址到物理地址转换指南 | Guide to Virtual-to-Physical Address Translation

基本概念 | Basic Concepts

  • 虚拟地址 (VA) | Virtual Address (VA): 程序使用的地址
  • 物理地址 (PA) | Physical Address (PA): 实际内存中的地址
  • 页 | Page: 固定大小的内存块
  • 页表 | Page Table: 存储 VA 到 PA 映射的数据结构
  • 页表项 (PTE) | Page Table Entry (PTE): 页表中的单个条目
  • 页偏移 | Page Offset: 页内的偏移量

系统参数 | System Parameters

  • 物理内存大小 | Physical Memory Size
  • 虚拟内存大小 | Virtual Memory Size
  • 页大小 | Page Size
  • 页表大小 | Page Table Size

地址结构 | Address Structure

虚拟地址 | Virtual Address

[ 虚拟页号 | Virtual Page Number (VPN) ][ 页偏移 | Page Offset ]

物理地址 | Physical Address

[ 物理页框号 | Physical Frame Number (PFN) ][ 页偏移 | Page Offset ]

转换步骤 | Translation Steps

  1. 计算地址位数 | Calculate Address Bits

    • 虚拟地址位数 = | Virtual address bits =
    • 物理地址位数 = | Physical address bits =
  2. 计算偏移位数 | Calculate Offset Bits

    • 偏移位数 = | Offset bits =
  3. 计算页号位数 | Calculate Page Number Bits

    • 虚拟页号位数 = 虚拟地址位数 - 偏移位数 | VPN bits = Virtual address bits - Offset bits
    • 物理页框号位数 = 物理地址位数 - 偏移位数 | PFN bits = Physical address bits - Offset bits
  4. 拆分虚拟地址 | Split Virtual Address

    • 提取虚拟页号 (VPN) | Extract Virtual Page Number (VPN)
    • 提取页偏移 | Extract Page Offset
  5. 查找页表 | Look up Page Table

    • 使用 VPN 作为索引查找对应的 PTE | Use VPN as index to find corresponding PTE
    • 从 PTE 中获取物理页框号 (PFN) | Get Physical Frame Number (PFN) from PTE
  6. 组合物理地址 | Combine Physical Address

    • 将 PFN 和页偏移组合形成物理地址 | Combine PFN and Page Offset to form Physical Address

TLB 在地址转换中的使用 | Using TLB in Address Translation

TLB 查询时机 | When to Query TLB

在每次内存访问开始时,在查询页表之前,处理器都会首先查询 TLB。

At the beginning of each memory access, the processor queries the TLB before consulting the page table.

TLB 查询步骤 | TLB Query Steps

  1. 提取虚拟页号(VPN)| Extract Virtual Page Number (VPN)

    • 从虚拟地址中提取 VPN 部分
    • Extract the VPN portion from the virtual address
  2. 并行比较 TLB 条目 | Parallel Comparison of TLB Entries

    • 将 VPN 与所有 TLB 条目的标记字段并行比较
    • Compare the VPN with the tag fields of all TLB entries in parallel
  3. 检查匹配项 | Check for a Match

    • 如果找到匹配项,检查其有效位
    • If a match is found, check its valid bit
  4. 验证访问权限 | Verify Access Permissions

    • 检查 TLB 条目中的保护位,确保当前访问操作(读/写/执行)是允许的
    • Check the protection bits in the TLB entry to ensure the current access operation (read/write/execute) is permitted

使用 TLB 项转换地址 | Using TLB Entry for Address Translation

如果 TLB 命中(找到匹配且有效的条目):

If there’s a TLB hit (a matching and valid entry is found):

  1. 提取物理页框号(PFN)| Extract Physical Frame Number (PFN)

    • 从匹配的 TLB 条目中获取 PFN
    • Retrieve the PFN from the matching TLB entry
  2. 合成物理地址 | Synthesize Physical Address

    • 将 PFN 与原始虚拟地址的页内偏移组合,形成完整的物理地址
    • Combine the PFN with the page offset from the original virtual address to form the complete physical address
  3. 执行内存访问 | Perform Memory Access

    • 使用生成的物理地址访问内存
    • Access the memory using the generated physical address

TLB 缺失处理 | Handling TLB Miss

如果 TLB 未命中:

If there’s a TLB miss:

  1. 查询页表 | Consult Page Table

    • 执行常规的页表遍历过程
    • Perform the regular page table walk process
  2. 更新 TLB | Update TLB

    • 将新的 VPN 到 PFN 映射添加到 TLB 中
    • Add the new VPN to PFN mapping to the TLB
  3. 重试内存访问 | Retry Memory Access

    • 使用更新后的 TLB 重新开始地址转换过程
    • Restart the address translation process with the updated TLB

示例 | Example

假设 | Suppose:

  • 虚拟内存大小 = 4GB | Virtual memory size = 4GB
  • 物理内存大小 = 2GB | Physical memory size = 2GB
  • 页大小 = 4KB | Page size = 4KB
  1. 计算地址位数 | Calculate address bits

    • 虚拟地址位数 = = 32 位 | Virtual address bits = = 32 bits
    • 物理地址位数 = = 31 位 | Physical address bits = = 31 bits
  2. 计算偏移位数 | Calculate offset bits

    • 偏移位数 = = 12 位 | Offset bits = = 12 bits
  3. 计算页号位数 | Calculate page number bits

    • 虚拟页号位数 位 | VPN bits bits
    • 物理页框号位数 = 位 | PFN bits = bits
  4. 虚拟地址结构 | Virtual address structure

    [ VPN (20 bits) ][ Offset (12 bits) ]
    
  5. 物理地址结构 | Physical address structure

    [ PFN (19 bits) ][ Offset (12 bits) ]
    
  6. 转换过程 | Translation process

    • 给定虚拟地址 0x8A5C3 | Given virtual address 0x8A5C3
    • 拆分: VPN = 0x8A5 (2213), Offset = 0x1C3 (451) | Split: VPN = 0x8A5 (2213), Offset = 0x1C3 (451)
    • 查找页表,假设 PTE[2213] = 0x40A2C | Look up page table, suppose `PTE[2213] = 0x40A2C
    • 组合: PA = (0x40A2C << 12) + 0x1C3 = 0x40A2C1C3 | Combine: PA = (0x40A2C << 12) + 0x1C3 = 0x40A2C1C3

注意事项 | Notes

多级页表 | Multi-level Page Tables

  • 对于大型虚拟地址空间,可能使用多级页表 | For large virtual address spaces, multi-level page tables may be used
  • 转换过程类似,但需要多次查表 | Translation process is similar but requires multiple table lookups