我已经通过下面的链接,它说在大多数操作系统上,指针存储虚拟地址而不是物理地址,但我无法获得将虚拟地址存储在指针中的好处。
当最后我们可以直接通过指针修改特定内存位置的内容,那么它是虚拟地址还是物理地址的问题是什么? 在代码执行期间,大部分时间数据段也将保留在内存中,因此我们只处理物理内存位置,以便虚拟地址如何有用?
答案 0 :(得分:2)
安全问题(如前所述)除此之外,还有另一大优势:
全局和函数(以及堆栈)总是可以在固定地址找到(因此汇编程序可以对它们进行硬编码),与程序实例的加载位置无关。
如果您真的希望代码从任何地址运行,则必须使其与位置无关(使用gcc,您将使用-fPIC
参数)。这个问题可能是-fPIC
和虚拟寻址的有趣读物:GCC -fPIC option
答案 1 :(得分:1)
相同的虚拟地址可以指向不同时刻的不同物理地址。
如果您的物理内存已满,您的数据将从内存换出到您的硬盘。当你的程序想要再次访问这个数据时 - 它当前没有存储在内存中 - 数据被交换回内存,但它通常与以前不同。 存储虚拟物理地址分配的页表将使用新的物理地址进行更新。因此,您的虚拟地址保持不变,而实际地址可能会发生变化。
答案 2 :(得分:1)
实际上,指针通常包含LOGICAL ADDRESSES。
使用逻辑寻址有几个原因,包括:
易于内存管理。操作系统永远不必为进程分配连续的物理页面帧。
安全。每个进程都可以访问自己的逻辑地址空间,并且不会弄乱其他进程的地址空间。
虚拟内存。逻辑地址转换是实现虚拟内存的先决条件。
页面保护。通过将对系统页面的访问限制为更高的处理器模式来辅助安全性通过限制对页面的访问类型(例如,不允许写入或执行数据页面)来帮助错误(和病毒)捕获。
这不是一个完整的清单。