Linux 中的虚拟内存和虚拟地址

Virtual Memory and Virtual Address in Linux

我目前正在研究操作系统中的虚拟内存,我的问题很少。

  1. 就Linux而言,交换分区或交换文件是否与虚拟内存相同?
  2. 如果是,那么万一我的 Linux 系统中没有启用交换,这是否意味着我的系统没有虚拟内存?
  3. 我还读到虚拟内存使系统更安全,因为使用虚拟内存,CPU 生成虚拟地址,然后由 MMU 将其转换为实际物理地址,因此保护系统,因为没有进程可以实际交互与实际的物理内存。因此,如果我只是在我的 Linux 系统上启用交换,我的 CPU 是否会开始生成虚拟地址并且目前它直接生成物理地址,因为我没有交换分区?
  4. CPU如何知道虚拟内存是否存在?

没有。交换文件与虚拟内存不同。

一旦 firmware/kernel 设置了必要的寄存器 and/or 内存数据结构并切换处理器模式,虚拟内存映射用于访问物理内存。

是的,进程无法在没有映射的情况下引用内存位置,这允许内核使用隔离和访问控制机制。

通过主动映射,不同的虚拟地址可以在不同的时间映射到同一个物理内存区域。内核可以维持这样一种错觉,即可用内存量大于实际物理内存的容量,其中在任何给定时间只有虚拟内存的一个子集驻留在物理内存中。其余的存储在交换文件中。

访问当前交换文件中相应数据所在的虚拟地址被内核捕获(通过页面错误)并可能导致内核交换中的数据, 并且交换 物理内存中的一些其他数据。

如果禁用交换文件,内核将没有地方存储换出的数据。这会减少可用的虚拟内存量。

没有交换 file/partition 并不意味着您没有虚拟内存。现代操作系统无论如何总是使用 paging/virtual 内存。

Is swap partition or swap file same as virtual memory in terms of Linux?

没有swap文件和虚拟内存对任何人来讲都是不一样的OS。虚拟内存只是表示所有内存访问都将由 MMU 使用页表进行转换。现代 OSes 总是使用分页。

If yes, then in case I've no swapping enabled in my Linux system, does that mean my system has no virtual memory?

你的系统肯定有虚拟内存。要使用长模式(64 位模式),OS 必须启用分页。我怀疑您的系统是否足够旧而不能使用分页。页面交换到硬盘不是虚拟内存。它更像是虚拟内存的一个特性,可以用来扩展物理内存,因为一个不需要的页面可以暂时交换到硬盘上。

I have also read that virtual memory makes system more secure because with virtual memory, CPU generates virtual addresses which are then translated to actual physical addresses by MMU, therefore securing the system because no process can actually interact with the actual physical memory. So if I just enable swapping on my Linux system, will my CPU start generating virtual addresses and currently it's directly generating physical addresses as I have no swap partition?

您的计算机肯定启用了 paging/virtual 内存。没有交换分区并不意味着您没有虚拟内存。分页也可用于避免 RAM 碎片和安全性。你是对的,分页正在保护你的系统,因为页表阻止一个进程访问另一个进程的内存。它还具有逐页循环特权,可以区分内核模式和用户模式代码。

How does CPU know if virtual memory is present or not?

OS 只是通过在控制寄存器中设置一个位来启用分页。然后 CPU 开始使用 MMU 盲目翻译每个内存访问。