将虚拟地址存储在指针而不是物理地址中有什么好处?

我已经通过下面的链接,它说在大多数操作系统上,指针存储虚拟地址而不是物理地址,但我无法获得将虚拟地址存储在指针中的好处。

最后我们可以直接通过指针修改特定内存位置的内容,那么它是虚拟地址还是物理地址的问题是什么? 此外,在代码执行期间,大多数情况下数据段也将保留在内存中,因此我们只处理物理内存位置,以便虚拟地址如何有用?

C指针和物理地址

实际上,指针通常包含LOGICAL ADDRESSES。

使用逻辑寻址有几个原因,包括:

  1. 易于内存管理。 操作系统永远不必为进程分配连续的物理页面帧。

  2. 安全。 每个进程都可以访问自己的逻辑地址空间,并且不会弄乱其他进程的地址空间。

  3. 虚拟内存。 逻辑地址转换是实现虚拟内存的先决条件。

  4. 页面保护。 通过将对系统页面的访问限制为更高的处理器模式来辅助安全性 通过限制对页面的访问类型(例如,不允许写入或执行数据页面)来帮助错误(和病毒)捕获。

这不是一个完整的列表。

除了安全问题(如前所述)之外,还有另一大优势:

全局和函数(以及您的堆栈)始终可以在固定地址找到(因此汇编程序可以对它们进行硬编码),而与加载程序实例的位置无关。

如果您真的希望代码从任何地址运行,则必须使其与位置无关(使用gcc,您将使用-fPIC参数)。 这个问题可能是-fPIC和虚拟寻址的有趣读物: GCC -fPIC选项

相同的虚拟地址可以指向不同时刻的不同物理地址。

如果物理内存已满,则数据会从内存换出到HDD。 当你的程序想要再次访问这个数据时 – 它当前没有存储在内存中 – 数据被交换回内存,但它通常与以前不同。 存储虚拟物理地址分配的页表将使用新的物理地址进行更新。 因此,您的虚拟地址保持不变,而物理地址可能会发生变化。