Linux 是否可以设置虚拟地址空间限制?

Linux 是否可以设置虚拟地址空间限制?,linux,virtual-memory,Linux,Virtual Memory,我当前的问题是,我必须决定内存地址是属于进程a还是进程B。因此,我想到的唯一解决方案是在不同的虚拟地址空间中运行进程(我的意思是,进程应该使用不同的虚拟地址范围),但我不知道这是否可行 示例: 假设进程A有自己的虚拟地址空间,并使用范围为0到10的虚拟地址。进程B同样有自己的虚拟地址空间,并使用相同范围内的虚拟地址。现在我有了一个第三方,它获得了这样一个地址,并且必须决定它属于哪个进程。如果进程A只使用0到4范围内的虚拟地址,进程B只使用5到10范围内的虚拟地址,那么第三方可以很容易地判断地址属

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

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

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

当然,由于MMU,物理地址是不同的

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

阅读并尝试

了解运行该
cat
命令的进程的地址空间。然后试试看

cat /proc/$$/maps
了解shell进程的地址空间,以及

cat /proc/$(pidof Xorg)/maps
了解服务器的地址空间

同时阅读

请注意,只有管理和关心物理地址(模块的物理地址)。阅读更多关于s


带有
RLIMIT\u AS
的系统调用可用于限制地址空间。

您从哪个角度问这个问题,为什么?您是否正在编写内核模块(我希望不是)?每个进程都在自己完全独立的(虚拟)地址空间中运行,包含从0到2^32-1(或2^64-1)的地址。给定一个特定的地址,无法判断该地址来自哪个进程,因为许多不同的进程实际上可能都在使用该地址。如果您是通过IPC或网络或其他方式从进程获取原始指针,那么您需要认真重新考虑一些设计问题…对,但是是否有可能将一个进程使用的虚拟地址限制为0到2^31,另一个进程使用的虚拟地址限制为2^31到2^32-1?在一般情况下,不-通过向编译器、汇编器和链接器传递大量额外的选项,您可能可以实现类似的功能,但这将是脆弱的,如果您想要扩展到三个或更多进程,这将是一个非常令人头痛的问题。更好的解决方案是修复“获得这样一个地址并且必须决定它属于哪个进程的第三方”——这是一种非常糟糕的设计方法。也许对你真正想要完成的事情进行更高层次的描述是个好主意……我明白,如果没有更多关于我想要完成什么的信息,这似乎是一个糟糕的设计。无论如何,我对这个“设计”没有影响,只是想知道这种可能性是否存在。你的回答对我很有帮助,因此我必须寻找其他方法。谢谢你的回答,我在问题中添加了一个示例,以更清楚地说明我真正想要的是什么。同样,每个进程都有自己的地址空间。我知道不同进程中相同的地址并不代表相同的内存,这也是问题的关键。我也理解虚拟地址的概念。我很难用另一种方式来描述它,而不是我给出的例子。如果我给您地址0x1234567,两个进程和一个进程尝试从“正确”进程读取结果,那么您无法确定哪个进程包含结果,除非两个进程在各自的虚拟地址空间中使用不同的地址范围。是否可以告诉进程A仅使用0x0000000到0x2000000范围内的地址?
cat /proc/$(pidof Xorg)/maps