美文网首页
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