【问题标题】:Can OS generate same logical Address for two different processes?操作系统可以为两个不同的进程生成相同的逻辑地址吗?
【发布时间】:2014-05-27 03:53:03
【问题描述】:

据我所知,CPU 在运行时为每条指令生成逻辑地址。

现在这个逻辑地址将指向指令的线性或虚拟地址。

现在我的问题是,

1) 操作系统可以为两个不同的进程生成相同的逻辑地址吗?

参考 "In virtual memory, can two different processes have the same address?" ,如果两个不同的进程在这种情况下可以具有相同的虚拟地址,那么逻辑地址也可能相同。

2) 只是为了澄清我的理解,每当我们编写复杂的 C 代码或简单的“hello world”代码时,虚拟地址将在构建时生成(编译->汇编->链接),其中逻辑地址将由 CPU 在运行时间?

请澄清我上面的疑问,如果我走错了路,请纠正我。

【问题讨论】:

    标签: c memory linux-kernel operating-system


    【解决方案1】:

    逻辑地址和虚拟地址是一回事。 CPU 在执行期间将逻辑/虚拟地址转换为物理地址。

    因此,是的,两个进程使用相同的虚拟地址不仅可能而且很常见。在 32 位操作系统下,这种情况很常见,只是因为地址空间相当有限,而且物理内存通常比地址空间多。但是举一个众所周知的例子,Windows 可执行文件的传统加载地址是 0x400000(我最后可能有错误的零数,但你明白了)。这意味着基本上 每个 在 Windows 上运行的进程通常会加载到相同的逻辑/虚拟地址。

    最近,Windows(与大多数其他操作系统一样)开始随机化内存中可执行模块的布局。由于经常使用大部分 32 位地址空间,这会改变模块的相对位置(它们在内存中的顺序),但意味着许多相同的位置用于不同的进程(仅用于每个进程中的不同模块)。

    64 位操作系统有更大的可用地址空间,因此当它在随机地址放置模块时,它有更多可用选择。更多的选择意味着在多个进程中使用相同地址的可能性要小得多。可能仍然有可能,但肯定要小得多。

    【讨论】:

    • 如果“逻辑地址和虚拟地址是同一件事”。但是如果我没记错的话,逻辑地址包含段选择器(16位),它提到了段(CS,DS等)和32位偏移量(段内的偏移量表示虚拟地址部分)那么CPU如何生成逻辑地址?生成逻辑地址时是否引用段头?
    • @NishithGoswami:32 位虚拟地址确实包括一个段和一个偏移量,但是所有当前(主要)操作系统基本上只是忽略它们——即,它们指向选择器的段寄存器都具有 0 的基地址和 4GB 的限制,因此它们对生成的地址没有影响。
    • 感谢您的澄清,还有一个疑问,操作系统根据构建时生成的虚拟地址生成逻辑地址(包含 16 位段选择器和 32 位偏移量)?
    • @NishithGoswami:不是,不是。它用选择器加载段寄存器,然后(大部分)不理会它们。它生成的所有地址都只是这些地址的 32 位偏移量。链接器为每个可执行模块生成一个基地址,但加载器可以(并且经常会)在构建进程时调整它们,以防止模块冲突和地址空间随机化。
    • 所以每当需要在主内存中加载新段时,操作系统会生成 48 位地址(逻辑地址),然后在同一段内的病房中,它会生成 32 位地址正确吗?
    猜你喜欢
    • 2012-07-04
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多