内核如何寻址交换分区或交换文件上的交换内存页?

内核如何寻址交换分区或交换文件上的交换内存页?

交换分区不包含结构化文件系统。内核不需要它,因为它将内存页存储在标记为交换区域的分区上。由于交换区中可能有多个内存页面,当进程请求将其页面加载到内存中时,内核如何定位每个页面?让我们解释更多:从 Devuan OS 查看交换分区的标头:

#define SWAP_UUID_LENGTH 16
#define SWAP_LABEL_LENGTH 16
struct swap_header_v1_2 {
    char          bootbits[1024];    /* Space for disklabel etc. */
    unsigned int  version;
    unsigned int  last_page;
    unsigned int  nr_badpages;
    unsigned char uuid[SWAP_UUID_LENGTH];
    char          volume_name[SWAP_LABEL_LENGTH];
    unsigned int  padding[117];
    unsigned int  badpages[1];
};

因此,当mkswap对分区执行命令时,这就是放置在该分区上的内容,即交换标头。

现在,我们假设一个场景,“进程 A”的内存页已交换,因此交换区域中有一个内存页。当然,交换区中可能有很多内存页。 “进程A”需要访问被交换的内存页。 “进程A”告诉内核,我可以得到交换的内存页吗?内核说:当然,我亲爱的朋友。内核在交换分区中查找“进程A”的内存页。由于交换分区不是一个复杂的结构(不是文件系统),内核如何知道如何在交换分区中找到“进程 A”的特定内存页?

也许内核在某个地方存储了这些交换页面的扇区地址,因此当进程请求其内存页面时,内核知道在交换分区中查找位置,从分区中读取内存页面并将其加载到内存中。

答案1

交换仅在给定的引导期间有效,因此所有跟踪信息都保存在内存中。页面的交换进出完全由内核处理,并且对进程是透明的。基本上,内存被分成页,在页表中进行跟踪;这些是每个 CPU 架构定义的结构。当一个页面被换出时,内核将其标记为无效;因此,下次有任何东西试图访问该页面时,CPU 将发生故障,这将导致调用内核中的处理程序;该处理程序负责恢复页面的内容。

在Linux中,有一个swap_info结构它描述了每个交换设备或文件。在该结构内,一个swap_map将内存页映射到交换设备或文件中的块。当页面被换出时,内核将swap_info索引和swap_map偏移量存储在相应的页表条目中,这使得它可以在需要时在磁盘上找到该页面。 (所有受支持的体系结构都在其页表中为此提供了足够的空间,但存在限制 -例如可用空间意味着 Linux 在 x86 上最多可以管理 64GiB 的交换空间。)

您可以在以下网址找到更详细的描述“交换管理”章节梅尔·戈尔曼的了解 Linux 虚拟内存管理器

相关内容