Linux从头学16:揭秘系统如何把“页目录和页表”当做物理页进行操作?
2023-09-22 23:30:45
前言
在 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 内核可以访问页目录和页表。这是一种非常巧妙的技术,它解决了页目录和页表本身也是物理页的一部分这一问题。