OS可以为两个不同的进程生成相同的逻辑地址吗?

时间:2014-04-13 03:51:25

标签: c memory linux-kernel operating-system

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

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

现在我的问题是,

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

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

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

请澄清我上面的疑虑,如果我的方向不对,请纠正我。

1 个答案:

答案 0 :(得分:2)

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

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

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

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