虚拟内存和页面文件有何关系?

虚拟内存和页面文件有何关系?

我们知道,在程序运行时,CPU 会产生逻辑地址,也称为虚拟地址。然后,这些虚拟地址由内存管理单元 (MMU) 转换为物理地址。我们知道虚拟内存允许将磁盘的某些部分(称为页面文件(交换空间))用作内存。因此,虚拟地址指向内存(RAM)+ 页面文件(交换空间)中的某个空间。但是,程序如何从既不在内存中也不在页面文件中的磁盘加载,因为 CPU 会生成虚拟地址,并且该虚拟地址始终指向内存(RAM)+ 页面文件(交换空间)中的某个地址。那个地址叫什么。最初,我认为逻辑地址/虚拟地址是指向硬盘上物理内存位置的地址。

我很困惑。谢谢你的帮助。

答案1

不在内存中的页面被标记为无效,然后任何访问都会触发操作系统的页面错误,操作系统将搜索可以加载页面的位置(页面文件,映射文件......),加载页面,更新页面指针并重新安排暂停的进程。

在 FreeBSD 上,有一个表,其中包含每个段(一组连续的页面)的物理地址及其分页器属性(分页器对象、索引、文件描述符……)。我猜 Windows 也有类似的系统。

答案2

然后,这些虚拟地址由内存管理单元(MMU)转换为物理地址。

只有当进程的内存内容驻留或映射时,虚拟地址才能转换为物理内存地址。
否则将发生(页面)错误,并且必须创建新的映射和/或从后备存储器(例如页面文件)检索该进程的内存内容(例如所需的页面)。此内容检索由内核使用存储设备(例如 HDD 或 SSD)的设备驱动程序执行。同时,进程调度程序将暂停当前进程,并(尝试)使准备执行的进程使用 CPU。

我们知道虚拟内存允许将磁盘中称为页面文件(交换空间)的部分用作内存。因此,虚拟地址指向内存(RAM)+页面文件(交换空间)中的部分空间。

不正确。
虚拟地址(本身)没有对后备存储的组件或引用。
后备存储(例如页面文件)的组织由操作系统(即软件)的内核控制。

此外,虚拟内存的内存内容甚至可能不保存在页面文件或交换区域中。
永不改变的程序代码不必交换出去,并且可以从程序文件中再次检索。
内存映射文件将被直接访问,而不是在页面文件或交换区域中重复。

因此,虚拟地址本身不足以提供识别其物理内存映射的信息,更不用说任何后台存储信息了。

但是,由于 CPU 会生成虚拟地址,并且该虚拟地址始终指向内存(RAM)+页面文件(交换空间)中的某个地址,因此程序如何从既不在内存中也不在页面文件中的磁盘加载。

程序(或任何文件)通过其文件名使用文件系统接口和底层块设备接口进行访问。
外围设备的数据使用输入/输出指令/操作而不是(主)内存访问进行传输。
内存映射 I/O 的实现模糊了 I/O 操作的概念,其中使用内存空间中的特殊地址而不是 I/O(或端口)空间中的地址来访问设备寄存器。
设备驱动程序是内核中的低级软件,用于处理此类设备读写操作的复杂性。

这些是基本的数字计算机架构概念,不适合以简单的问答形式进行简要解释。

该地址叫什么名字。

大容量存储设备(例如 HDD 和 SSD)(又称块设备)在设备级别使用 LBA(逻辑块地址)(又称扇区号)进行访问。每个 LBA 引用一个固定大小数据的逻辑块,通常为 512 字节。

最初我认为逻辑地址/虚拟地址是指向硬盘中物理内存位置的地址。

不正确。
大容量存储设备(例如 HDD 和 SSD)在设备级别使用 LBA(逻辑块地址)进行访问。
在更高级别,文件系统使用文件系统分配单元的地址(例如簇号)引用文件的内容。文件系统通过按文件名和目录引用文件来提供组织。
在更高级别,卷或驱动器管理处理哪些分区和文件系统可访问。

LBA 和虚拟内存地址之间没有固定的关系或联系。
后备存储(例如页面文件)的内容和虚拟内存之间的任何关系都将由内核使用进程信息和页表等信息进行控制。

请注意,大多数现代虚拟内存的实现都使用固定大小的页面,但也有其他可能的方案。

相关内容