【问题标题】:Possible to set the virtual address space limits?可以设置虚拟地址空间限制吗?
【发布时间】:2014-12-10 14:17:28
【问题描述】:

我目前的问题是我必须决定一个内存地址是属于进程 A 还是 B。因此我想到的唯一解决方案是在不同的虚拟地址空间中运行进程(我的意思是进程应该为他们的虚拟地址使用不同的范围),但我不知道这是否可能。

示例:
假设进程 A 有自己的虚拟地址空间并使用 0 到 10 范围内的虚拟地址。进程 B 同样有自己的虚拟地址空间并使用相同范围内的虚拟地址。现在我有一个第三方获得了这样的地址,并且必须决定它属于哪个进程。如果进程 A 只使用 0 到 4 范围内的虚拟地址,而进程 B 只使用 5 到 10 范围内的虚拟地址,那么第三方可以很容易地判断该地址属于哪个进程。

【问题讨论】:

  • 您从哪个角度以及为什么提出这个问题?你在编写内核模块吗(我希望不是)?
  • 每个进程都在自己完全独立的(虚拟)地址空间中运行,需要从 0 到 2^32-1(或 2^64-1)的地址。给定一个特定的地址,无法判断该地址来自哪个进程,因为许多不同的进程实际上可能使用该地址。如果您是通过 IPC 或网络或其他方式从进程中获取原始指针,那么您需要认真重新考虑一些设计问题...
  • 对,但是是否有可能将使用的虚拟地址限制为例如一个进程为 0 到 2^31,另一个进程为 2^31 到 2^32-1?
  • 在一般情况下,不会 - 您可以通过将大量额外选项传递给编译器、汇编器和链接器来实现类似的效果,但它会很脆弱,如果你曾经想要扩展到三个或更多进程,这将是一个令人头疼的问题。更好的解决方案是修复“获得这样一个地址并必须决定它属于哪个进程的第三方”——恕我直言,这是一种非常糟糕的设计方法。也许对你真正想要完成的事情进行更高层次的描述会是一个好主意......
  • 嗯,我知道如果没有更多关于我想要完成的信息的信息,这似乎是一个糟糕的设计。无论如何,我对这个“设计”没有影响,只是想知道这种可能性是否存在。您的回答对我有帮助,所以我必须寻找其他方法。

标签: linux virtual-memory


【解决方案1】:

根据定义,每个(Linux 或 Posix)process 都有自己的(虚拟)address space,并在virtual memory 中执行其(用户级)指令。因此,进程 A 中的地址 0x1234567 与进程 B 中的相同地址 0x1234567 引用的内存不同。

当然物理地址是不同的,感谢MMU

所以不同的进程有不同的地址空间。他们可能会使用shared memory 共享一些片段,但这并不常见。参见例如shm_overview(7) & mmap(2)

阅读proc(5) 并尝试

cat /proc/self/maps

了解运行cat 命令的进程的地址空间。那就试试吧

cat /proc/$$/maps

了解您的 shell 进程的地址空间,以及

cat /proc/$(pidof Xorg)/maps

了解您的Xorg 服务器的地址空间。

另请阅读Advanced Linux Programming

请注意,只有Linux kernel 管理和关心物理 地址(用于RAM 模块的地址)。阅读有关MMUs 的更多信息。

带有RLIMIT_AS 的setrlimit(2) 系统调用可用于限制地址空间。

【讨论】:

  • 感谢您的回答,我在问题中添加了一个示例,以便更清楚地了解我真正想要的内容。
  • 同样,每个进程都有自己的地址空间。
  • 我知道不同进程中相同的地址并不指向相同的内存,这也是重点。我也理解虚拟地址的概念。除了我给出的例子之外,我很难用另一种方式来描述它。如果我给您地址 0x1234567,两个进程和一个尝试从“正确”进程读取结果,那么您无法确定哪个进程包含结果,除非两个进程将在自己的虚拟地址空间中使用不同的地址范围。是否可以告诉进程 A 仅使用例如范围内的地址0x0000000 到 0x2000000?
猜你喜欢
  • 2021-03-18
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2020-04-16
相关资源
最近更新 更多