【Linux】重谈页表寻址|深入理解物理内存和页表的映射|页框|CPU|CR3|MMU

目录

​编辑

前言

页框 

页表 

​编辑 寻址过程


 

前言

每个进程都有自己的内存地址空间,该空间其实都是虚拟地址,要借助页表来映射到实际物理内存地址中。而真实的页表是如何的呢?

之前介绍过OS和磁盘文件进行IO的基本单位是4kb = 八个扇区;而OS对内存的管理工作基本单位也是4kb;

OS进程内存管理,不是以字节为单位,而是以内存卡为单位,默认大小是4kb;

页框 

页框(Page Frame):

        是物理内存中的固定大小的块,通常为4KB。在物理内存中,页框是用于存储实际数据的最小单元。假设内存大小为4GB,也就能划分出1024*1024个页框。当进程通过页表来访问物理地址时,其本质就是找到页框的地址。 

操作系统对于物理内存的管理变成了对页框块的管理;一个页框是什么呢?❓

在Linux内核中,使用struct page结构来描述内存中的每一页框。这个结构体定义在内核头文件include/linux/mm_types.h中。该结构体通常有以下字段:flags:标志位,表示页面的各种状态;

  • mapping:指向该页框所属的地址空间
  • index:该页框在地址空间中的偏移量
  • _maocount:记录该页框到页表条目数
  • _refcount:页面引用计数。表示有多少用户正在使用该页框
struct page {
    void *address;          // 物理地址
    unsigned long flags;    // 页面标志(例如是否在使用、是否脏等)
    struct page *next;      // 指向下一个页面的指针(可能用于链表)
    unsigned int usage;     // 页面使用计数
    unsigned int refcount;  // 引用计数
    unsigned int type;      // 页面类型
    unsigned int index;     // 页面索引
};

页表 

页表是用于存储物理内存与虚拟内存地址之间的映射关系的结构。每个进程都有属于自己的页表。页表是由页目录和页表项组成的。

每个虚拟地址都是 32个比特位,即 0000 0000 0000 0000 0000 0000 0000 0000;

        前面10个比特位存储的是页目录;

        中间10是二级页表;

        最后剩下的12个比特位作为偏移量(对应着二级页表指向页框起始地址处后进行偏移)

寻址如下:

  • 虚拟地址的前10个比特位在页目录当中进行查找,找到对应的页表(页目录用于索引相应的页表),2^10字节 = 1KB,存储页目录所需的内存是 1KB,且页目录只有一张;
  • 再选择虚拟地址中间的10个比特位在对应的页表当中进行查找,找到物理内存中对应页框的起始地址,每张页表的大小也是 2^10字节 = 1KB,页表是有多张的;
  • 最后将虚拟地址中剩下的12个比特位作为偏移量从对应页框的起始地址处向后进行偏移,找到物理内存中某一个对应的字节数据,2^12字节 = 4KB,与物理内存的页框对应

 寻址过程

MMU 接收到一个虚拟地址。

这个虚拟地址被分成三个部分:页目录索引、页表索引和页内偏移量。

MMU 使用 CR3 中的值找到页目录表的物理地址,通过页目录索引查找页目录表中的对应项,得到指向页表的物理地址,使用页表索引查找页表中的对应项,得到指向页框的物理起始地址,将页框的物理地址与页内偏移量组合,形成最终的物理地址。

实现了虚拟内存到物理内存的有效转换。

<think>好的,用户现在问的是“四级物理地址”,我需要先理解这个术语的具体含义。可能涉及不同的领域,比如计算机系统、网络架构或者存储技术。首先想到的是计算机内存管理中的多级页表结构。 四级物理地址可能指的是在虚拟内存系统中,使用四级页表来将虚拟地址转换为物理地址。现代操作系统,比如Linux,在64位系统上通常使用四级或五级页表。这种情况下,四级页表包括PGD、PUD、PMDPTE这四个层级,每一级负责解析虚拟地址的不同部分,最终找到物理地址。 不过用户可能不太清楚这些细节,所以需要解释得通俗一些。要说明四级页表的作用,为什么需要这么多层级,以及它们如何提高内存管理的效率。同时,可能需要举例说明地址转换的过程,比如虚拟地址如何被拆分成不同的索引,逐级查询页表,最后得到物理地址。 另外,也有可能用户指的是其他领域的四级地址结构,比如网络中的分层寻址,或者是存储设备中的物理块寻址。但根据常见的计算机问题,内存管理的可能性更高。需要确认用户的具体上下文,但如果没有更多信息,先按内存管理来解释比较稳妥。 还要注意用户的技术背景,使用合适的术语但不过于晦涩。可能需要对比其他级别的页表,比如二级或三级,说明四级页表的优势,比如支持更大的地址空间,减少内存碎片等。同时,提到实际应用,比如在Linux系统中的实现,或者硬件支持如Intel的CPU机制。 最后,提醒用户如果具体场景不同,比如嵌入式系统或其他领域,可能需要进一步的澄清。确保回答全面,同时引导用户提供更多信息以便更精准的解答。</think>关于“四级物理地址”,通常出现在计算机体系结构与内存管理领域,其核心与**多级页表地址转换**机制相关。以下是技术解析: --- ### **基本概念** 在支持虚拟内存的现代操作系统中,CPU通过**多级页表**将**虚拟地址(逻辑地址)**转换为**物理地址**。 - **四级物理地址**:指需要通过**四级页表结构**完成地址转换的物理内存寻址方式。 - **典型应用场景**:x86-64架构的64位系统(如Linux内核默认采用四级页表)。 --- ### **四级页表结构解析** 以x86-64架构为例,虚拟地址被划分为多个字段,每级页表解析一个字段: | 层级 | 名称 | 作用 | |------|----------------------|------------------------------| | 1 | **PGD** (Page Global Directory) | 全局目录,索引顶级页表| | 2 | **PUD** (Page Upper Directory) | 上层目录,划分大内存区域 | | 3 | **PMD** (Page Middle Directory) | 中间目录,管理中等内存块 | | 4 | **PTE** (Page Table Entry) | 页表项,最终指向物理帧地址 | **地址转换流程**(以虚拟地址`V`为例): 1. 从`CR3`寄存器获取PGD基地址 2. 用`V`的第1字段索引PGD → 得到PUD基地址 3. 用`V`的第2字段索引PUD → 得到PMD基地址 4. 用`V`的第3字段索引PMD → 得到PTE基地址 5. 用`V`的第4字段索引PTE → 获得物理帧号 6. 组合内偏移 → 最终物理地址 --- ### **为何需要四级结构?** 1. **支持超大地址空间** 64位系统理论寻址空间达$2^{64}$字节,四级分可灵活管理海量内存。 2. **节省内存开销** 稀疏地址空间仅需加载必要页表(对比单级页表需全量驻留内存)。 3. **兼容性与扩展性** - 可通过增加层级(如五级页表)支持更大地址空间 - 向下兼容32位分模式 --- ### **实际应用示例** - **Linux内核实现**: ```c // 四级页表数据结构(arch/x86/include/asm/pgtable_types.h) typedef struct { pgd_t pgd; } pgd_t; // PGD typedef struct { pud_t pud; } pud_t; // PUD typedef struct { pmd_t pmd; } pmd_t; // PMD typedef struct { pte_t pte; } pte_t; // PTE ``` - **硬件支持**: Intel CPUMMU(内存管理单元)自动完成四级地址转换。 --- ### **扩展知识** - **五级页表(LA57)**:为支持更大物理内存(如服务器系统),x86-64扩展为五级分(新增P4D层)。 - **反向映射(Reverse Mapping)**:通过物理地址反向查找虚拟地址,用于内存回收优化。 --- 若您的问题涉及其他领域(如网络协议、存储设备物理块号等),请补充上下文以获取针对性解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值