返回

Linux从头学16:揭秘系统如何把“页目录和页表”当做物理页进行操作?

闲谈

前言

在 x86 系统中,内存管理中的分页机制是非常重要的,在 Linux 操作系统相关的各种书籍中,这部分内容也是重笔浓彩。如果你看过 Linux 内核相关书籍,一定对下面这张图又熟悉、又恐惧:

这是 Linux 内核中的内存管理数据结构示意图,其中“页目录”和“页表”是两个关键的概念。页目录和页表本质上都是数据结构,存储着物理页面的相关信息。通过页目录和页表,Linux 内核可以将虚拟地址映射到物理地址,从而实现对内存的管理。

内核如何把页目录和页表当做物理页进行操作?

页目录和页表本身也是数据结构,它们也需要存储在内存中。这就产生了一个问题:页目录和页表本身也是物理页的一部分,那么 Linux 内核是如何把页目录和页表当做物理页进行操作的呢?

答案是:Linux 内核使用了一种巧妙的技术,将页目录和页表本身也映射到物理地址空间中。这种技术被称为“页目录页表标识符”(Page Directory Pointer Table,简称 PDPT)。

PDPT 是一种特殊的数据结构,它存储着页目录和页表的物理地址。当 Linux 内核需要访问页目录或页表时,它会首先通过 PDPT 找到页目录或页表的物理地址,然后再访问页目录或页表。

PDPT 的作用

PDPT 的作用非常重要,它可以将页目录和页表本身映射到物理地址空间中,从而使 Linux 内核可以访问页目录和页表。PDPT 的具体结构如下:

struct pdpte {
    unsigned long pfn : 22;
    unsigned long reserved : 10;
    unsigned long present : 1;
    unsigned long write : 1;
    unsigned long user : 1;
    unsigned long accessed : 1;
    unsigned long dirty : 1;
    unsigned long ps : 1;
    unsigned long global : 1;
};

其中,pfn 字段存储着页目录或页表的物理地址,present 字段指示页目录或页表是否存在,write 字段指示页目录或页表是否可写,user 字段指示页目录或页表是否可被用户访问,accessed 字段指示页目录或页表是否被访问过,dirty 字段指示页目录或页表是否被修改过,ps 字段指示页目录或页表是否为页大小的页目录或页表,global 字段指示页目录或页表是否为全局页目录或页表。

结论

通过 PDPT,Linux 内核可以将页目录和页表本身映射到物理地址空间中,从而使 Linux 内核可以访问页目录和页表。这是一种非常巧妙的技术,它解决了页目录和页表本身也是物理页的一部分这一问题。