美文网首页
Linux kernel之一内存寻址之分页

Linux kernel之一内存寻址之分页

作者: 1哥 | 来源:发表于2021-11-15 21:49 被阅读0次

1.硬件中的分页

1.1 页实现原理

  • MMU的分页管理单元将线性地址转换成物理地址
  • page
  1. 将线性地址空间划分成固定长度的管理单元;
  2. 内核为page 指定物理地址和访问权限,而不是整个线性地址
  • page frame
    将整个物理地址空间划分成固定长度的管理单单元;
  • page table
    1)负责映射线性地址到物理地址
    2)位于内存中
    3) 在分页单元使能前,初始化page table

1.2 两级分页方案的实现

  • 减少每个进程的页表需要的内存的数量
  • 线性地址划分成三部分
字段 位数
Directory 10 bit
Table 10 bit
offset 12 bit
  • 两级页表
    页目录-包含1024 entry
    页表-包含1024个entry

  • 每个进程分配了一个页目录
    页目录的物理地址存放在cr3 控制寄存器中

  • 线性地址到物理地址的转换过程
    1)线性地址的Directory 部分,确定cr3 指向的页目录页表中的entry,这个entry 指向合适的page table;
    2)线性地址的Table 部分,确定1)中的page table 中的entry,这个entry 包含page frame的物理地址
    3)线性地址的Offset 确定在page frame中的偏移


    image.png
  • 例子
    1)线性地址0x20021406
    2)线性地址的Directory 0x80部分选择页目录的entry 0x80, 这个entry指向与这个进程内存页的叶表;
    3)线性地址的Table部分0x21用于选择页表的entry 0x21,这个entry指向与这个进程page的page frame;
    4)线性地址的Offset 部分0x406用于选择page frame 的偏移0x406.
    5)若页表的entry 0x21 的present flag 被清除了,那么这个page 不在内存中;分页管理单元会发出页错误异常。


    image.png

1.3 扩展分页

  • page frame 大小为4MB,而不是4KB
  • 用于将大的连续的线性地址范围转换成对应的物理地址范围
  • 不需要中间的叶表,节省内存
  • 通过页目录entry. 的page size flag 来使能
字段 位数
Directory 10 bit
Offset 22 bit
image.png

1.4 物理地址扩展分页机制(PAE)

  • 可访问内存空间从4GB到64GB,扩展32bit 物理地址访问最大4GB空间的限制;
  • 硬件增加地址线引脚从32个到36个
  • cr4 PAE flag 激活PAE 功能
  • 有两级分页方案改为三级方案,高2bit 引用PDPT
  • 页目录和页表的entry 从32bit,增加到64bit, 这样他们的基地址从20bit扩展到24bit
名称 用途
cr3 指向PDPT
bits 31-30 指向PDPT中的entry1-4
bits 29-21 指向页目录中的entry 1-512
bits 20-12 Offset 指向页表中的entry 1-512
bits 11-0 Offset 4KB 中的偏移
image.png
  • 页目录中PS flag 激活2MB 的page
名称 用途
cr3 指向PDPT
bits 31-30 指向PDPT中的entry1-4
bits 29-21 指向页目录中的entry 1-512
bits 20-0 Offset 2MB 中的偏移

1.5 64位架构的分页机制

  • x86 64位地址只使用其中的48位;
  • 在32位两级分页的基础之上增加两级分页;


    image.png

1.6 TLB

  • 缓存page table 的entry, 加速线性地址的转换的cache,
  • 每个CPU 有自己的TLB
  • 当一个CPU 的cr3 修改后,硬件自动invalidate 本地TLB 的所有entry
  • 第一次访问线性地址,物理地址通过访问内存中的page table 计算而来,并存到TLB 中
  • 后续的访问通过TLB

2.分页在Linux 中的实现

  • 为32bit 和64bit 架构采用公共的分页模型
  • 2.6.10,采用三级分页,2.6.11,采用四级分页
  • 四种页表:
页表类型 用途
page global directory 包含多个page Upper directory的地址
page Upper directory 包含多个page Middle directory的地址
page Middle directory 包含多个page Table的地址
page Table 包含多个page table entry
  • 线性地址划分成五部分


    image.png
  • 分页

    • 32位架构 + PAE disable 采用两级分页
      1)通过set 成0bit, 去掉Page upper directory 和Page Middle directory)
      2)page Upper 和 page Middle table 只有一个entry

    • 32位架构 + PAE enable 采用三级分页
      1)page global 就是PDPT
      2)去掉Page upper
      3)Page Middle 对应Page directory

    • 64位架构
      三级或四级依靠HW


      image.png
  • 每个进程有自己的一套页表
    1)进程切换时,保存当前的cr3 到当前的进程描述符中,加载下一个要执行的进程的描述符的cr3
    2)这样分页管理单元引用正确的一套页表

相关文章

网友评论

      本文标题:Linux kernel之一内存寻址之分页

      本文链接:https://www.haomeiwen.com/subject/caszzltx.html