【问题标题】:Keeping address space size to 4 GB in 64 bit将 64 位地址空间大小保持为 4 GB
【发布时间】:2011-09-23 09:23:35
【问题描述】:

我想让一些应用程序在 64 位处理器(x86 xeon,8 核)上运行的 64 位操作系统中以 4 GB 地址空间运行。我知道有一个使用 -m32 选项进行编译的选项,但是目前我正在使用的计算机没有使用 -m32 编译所需的支持,所以我不能使用它,我也不能安装那台电脑上的任何东西,因为我没有任何权利。

现在我的问题是是否有可能将地址空间限制为 4 GB。请不要问我为什么要这样做,只要告诉我如果可能的话。谢谢。

【问题讨论】:

  • 让我猜猜:你有一些你不能/不会接触的代码将指针存储在 int 句柄中?
  • 不清楚的问题:1)你想限制你的程序只使用 0..4GB 的线性地址,还是 2)你想限制程序地址空间的总大小为 4GB,不管它放在哪里?
  • @zvrba,线性地址从 0 到 4GB。你认为 ulimit -v 就足够了吗?
  • @Luther。不完全是,但由于有点相似。
  • @MetallicPriest:嗯,ulimit -v/setrlimit(RLIMIT_AS) 限制了进程可以使用多少地址空间,但不能保证地址的数值会小于限制。

标签: c linux 64-bit x86


【解决方案1】:

在 bash 中通过 ulimit 访问的 ulimit/setrlimit 机制可以做到这一点,但有一些小缺点。

ulimit -v 4000000

应将当前进程组可用的内存限制为 4 GB。

但是,它限制了地址空间映射的总 大小,并且不限制映射的偏移量 - 你仍然可能有大于 2^32 的指针。

【讨论】:

  • 谢谢蒂顿。假设我的应用程序不需要太多内存并且可以轻松使用 4 GB,那么有什么缺点?
  • 我知道的一个:您无法精确控制内存分配,因为它仅限于进程组。可能还有其他人,至少我听说过。
【解决方案2】:

您可以尝试使用setrlimit 在进程初始化期间通过RLIMIT_AS 属性对其施加虚拟内存限制。我以前使用setrlimit增加对用户空间进程的资源分配,但我不明白为什么它在另一个方向上也不起作用。

【讨论】:

  • 不明白为什么允许增加资源分配... Setrlimit 仅用于减少允许的资源。或者你是超级用户?
  • 是的,在以 root 权限运行的监督用户空间应用程序中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 2010-11-10
  • 2016-09-06
相关资源
最近更新 更多