虚拟内存什么时候不再那么虚拟了?

虚拟内存什么时候不再那么虚拟了?

在 Windows、Mac 和 Linux 上,RAM 堆栈中每个应用软件进程都有虚拟内存。

但就我的内存访问数据类型的实际使用而言,我的内存究竟会被映射到哪里,以及何时变为物理内存:

1.编译后。

2.编译过程中。

3.加载并执行。

我之所以问这个问题,是因为必须保护内存以避免内核覆盖、无效访问或操作,如果我事先不知道内存的确切位置,我应该如何在程序中处理内存,从而无法直接跟踪我的程序将准确使用的总内存位。

答案1

程序看到的地址空间始终是虚拟的。(至少在每个现代操作系统中都是如此。)
您可以通过调用操作系统 API 来分配内存(或者当您在代码中定义变量时,编译器会为您分配内存)。
您为此分配的内存返回的地址(或指针,无论编程语言如何称呼它们)在程序上下文中有效。
对于您自己分配的内存,您有责任将其返回给操作系统。如果编译器代表您执行了操作,则编译器还将包含必要的清理。当您的程序退出时,操作系统也会进行一些清理。

程序数据在计算机物理 RAM 中的实际位置完全是理论性的。您的操作系统会将程序看到的虚拟地址空间映射到物理 RAM 和/或交换空间中。您自己根本无法知道在任何时候如何完成此操作。

如果您正在编写设备驱动程序或内核组件,那么这可能很重要,但您显然不具备所需的操作系统和编程知识。从您的问题中可以清楚地看出这一点。
此类软件在不同的级别运行,可能必须与实际物理 RAM 交互。有特殊的方法和 API 可以处理这个问题,但您永远不会在普通的用户编写程序中遇到它们。
另一种可能性是,当您在嵌入式设备上进行低级编程时,没有操作系统在虚拟 RAM 和物理 RAM 之间提供这一抽象层。再次强调:这是专家的事情。

如果您按照编程语言的规则编写了正确的程序,那么您就不必担心这一点。
当然:如果您的程序不正确(例如访问了从未分配的内存),程序可能会崩溃,或者如果操作系统发现程序行为不当,程序本身将被终止。找出问题所在并纠正程序中的问题是编程的一个重要方面。这称为调试。

答案2

这篇 wiki 文章描述了您想知道的一切。

http://en.wikipedia.org/wiki/Translation_lookaside_buffer

相关内容