控制Linux和Windows上的内存虚拟化



这是一个半理论问题。

在为Windows(例如MSVS12 C++)和Linux(例如g++)编译时,我是否可以指定内存的虚拟化模式(纯分段/分段+分页/仅分页)?

我已经阅读了所有MSVS链接器+编译器选项,在其中没有发现任何控制点。

对于g++来说,对于这样的问题,手册太复杂了。

这个问题的来源是这个链接

我从理论和实践中知道,这些应该是可能的,或者在某种程度上受到操作系统策略的限制,因为酷睿i7支持我上面提到的所有三种模式。

实际背景:

创建大量数据的代码在这里,函数Init-如果我想在堆上有超过2-3G的素数,它会耗尽我的内存。

Intel x86 CPU总是使用一些无法关闭的形式分割。在64位模式下,代码分割是有限的,但它仍然存在。Windows和Linux都需要分页才能在英特尔CPU上工作(尽管Linux在某些其他CPU架构上不使用分页)。在英特尔CPU上启用64位模式还需要分页。

换句话说,在Windows和Linux上,操作系统总是使用分段和分页,在它们上运行的任何应用程序也是如此,尽管这在很大程度上是透明的。不可能像您在链接的答案中所说的那样"编译+链接以进行‘无分页分割’"。也许你提到的这本书是指古老的16位版本的Windows(3.1或更早版本),它可以在支持80286 CPU的模式下运行,而这些CPU没有分页功能。尽管即使在那时,这通常也不会对编译和链接应用程序的方式产生任何影响。

您所描述的不是编译器的函数,甚至不是链接器。

当你运行程序时,你会得到已经在系统上运行的内存模型。编译后的代码并不关心底层的内存模式。

但是,如果程序开始在未受保护的处理器模式下运行,则程序本身可以更改内存模型。

最新更新