【问题标题】:Control over memory virtualization on Linux and Windows在 Linux 和 Windows 上控制内存虚拟化
【发布时间】:2014-10-23 16:51:01
【问题描述】:

这是一个半理论的问题。

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

我已经阅读了所有 MSVS 链接器+编译器选项,但没有找到任何控制点。

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

这个问题的来源是这个-link

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

实践背景:

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

【问题讨论】:

  • 如果我正确理解您的问题,这些东西是在引导加载期间设置的系统范围内,没有任何现代内核将在没有分页以允许用户空间、访问控制和分页的情况下运行。
  • 如果我正确理解您的评论,win7 和例如 ubuntu14.04 在引导加载系统范围内设置它们的分页/分段选项?如果是这样,默认值是什么(如果用户没有修改操作系统的这些方面)?据我了解,在win7程序中堆是其中的一部分。是否分页取决于什么?
  • 我很确定如果没有分页提供的精细控制,Windows 或 linux 都无法运行。即使交换被禁用,两者都使用分页进行访问控制。
  • @Linuxios,谢谢。我读过这个理论上的 Tanenbaum 的“S.C.O.”书,它在应用程序上相当模糊。我想,这三种模式在实践中并没有明确的界限,其中一些仅用于遗留代码执行。

标签: linux windows memory virtualization


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    Intel x86 CPU 总是使用某种无法关闭的表单分段。在 64 位模式下,代码分段是有限的,但仍然存在。 Windows 和 Linux 在 Intel CPU 上工作都需要分页(尽管 Linux 在某些其他 CPU 架构上不使用分页)。在 Intel CPU 上启用 64 位模式也需要分页。

    换句话说,在 Windows 和 Linux 上,操作系统总是使用分段和分页,任何应用程序在它们上运行也是如此,尽管这在很大程度上是透明的。正如您在链接的答案中所说,不可能“为'不分页的分段'编译+链接”。也许您引用的书指的是古老的 16 位版本的 Windows(3.1 或更早版本),它可以在支持没有分页的 80286 CPU 的模式下运行。尽管即便如此,这通常对您编译和链接应用程序的方式没有任何影响。

    【讨论】:

    • 嗨!我的问题的实际背景如下:我前段时间编写了一个 C++ 程序,它在堆上创建了一个非常大(超过 4G 物理中用户可用的 2-3G)数据结构。我将它编译为 x86-64。它因一些(对不起,不记得细节)内存不足异常而崩溃。不应该t my heap mem segment be paged out while it was growing up? What Im 得到吗?
    • 创建大量数据的代码在这里,函数 Init - github.com/ddsherstennikov/AscendingPrimeSequences/blob/master/…
    • 您应该发布一个新问题,询问为什么您的程序在分配大量内存时会崩溃。尝试简化为因相同错误而崩溃的示例程序,并将其包含在您的问题中。确保还包括确切的错误消息、有关如何编译它以及运行它的操作系统的详细信息。
    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 2021-06-17
    • 2021-07-25
    • 2014-06-17
    • 2012-05-05
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多