【问题标题】:Allow 32-bit application use more than 4GB of ram under FreeBSD在 FreeBSD 下允许 32 位应用程序使用超过 4GB 的内存
【发布时间】:2016-10-28 05:24:45
【问题描述】:

我目前正在 FreeBSD 下开发一款游戏。我使用clang 作为 32 位二进制文​​件编译它并在 64 位系统下运行它(我在这个系统下有 32GB 的 RAM),但我需要使用超过 4GB 的 RAM,因为它只使用 4GB。
即使我运行多个游戏实例,它也无法访问超过 4GB 的 RAM。

另外,我尝试在 64 位系统下编译它,但它有一个奇怪的行为。我遇到了很多错误。

我知道 Windows 上的 Visual Studio 有一个选项 /LARGEADDRESSAWARE,或者类似的东西可以让 32 位应用程序能够使用更多 RAM,还是我错了?
是否有任何我可以指定的标志(如 Windows 标志)以使我的二进制文件能够使用更多 RAM?我读过一些关于mcmodel=large(或medium)的文章,但我不确定这就是我要找的。
交叉编译怎么样?有谁知道我在哪里可以找到一些关于它的好信息?
谢谢。

【问题讨论】:

  • "另外,我尝试在 64 位系统下编译它,但它有一个奇怪的行为。我遇到了很多错误。" -- 然后你会想要修复这些错误。如果您有自己无法解决的具体问题,那可能是一个很好的问题。这也适用于 Windows:/LARGEADDRESSAWARE 也不会让您的应用程序地址超过 4GB。
  • 查看内存映射文件。

标签: c++ clang freebsd clang++


【解决方案1】:

您只能使用 32 位整数寻址 4GiB。 2^32 = 4294967296 = 4 * 1024 * 1024 * 1024

没有办法在 32 位可执行文件中拥有超过 4GiB 的地址空间。这是一个数学限制。诚然,您可以使用交换和物理地址扩展来处理进程中超过 4GiB 的数据,但在任何给定时间,您都不能处理超过 4GiB 的数据。

【讨论】:

  • PAE 仅与内核模式相关。等效的用户模式类似于mmap。无论哪种方式,寻址超过 2^32 字节的唯一方法是交换(或“银行”)部分地址空间。
  • @Rhymoid:确实 PAE 仅与内核模式相关,但我想尽可能地保留答案和一般性。 32 位意味着 4 GiB 的地址空间,仅此而已。
【解决方案2】:

要使用超过 4GB 的 RAM,您需要 64 位版本的 FreeBSD。这基本上意味着“amd64”而不是“i386”架构。您可以在 64 位系统下运行 32 位二进制文​​件,这将使多个实例使用超过 4GB 的 RAM 成为可能;显然,一个人无法解决更多问题。

【讨论】:

  • 正如我所指定的,我在具有 32GB RAM 和 FreeBSD x64 的专用服务器上运行它,使用它的 30 个实例,但我总是有超过 26GB 的可用 RAM。另外,我有一个使用 RAM 的 mysql 服务器。我认为它应该使用更多的 RAM。
  • 应该的。你能粘贴实际的统计数据吗?
猜你喜欢
  • 1970-01-01
  • 2011-08-20
  • 2010-12-23
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 2014-02-27
相关资源
最近更新 更多