1

假设我正在启动同一程序的两个实例。两个程序的文本区域是否具有相同的虚拟地址?

4

2 回答 2

1

要看。在大多数系统上,如果您在相同的环境(相同的参数等)中两次运行相同的程序,您会发现相同的地址映射。这仅仅是因为进程所做的大部分工作都是确定性的,仅取决于环境、命令行参数、读取的文件内容,而不取决于更改的数据,例如日期或进程 ID。这在调试时非常有用:如果您重新启动程序,有时即使在进行少量代码更改和重新编译后,内存布局仍有可能保持不变。当然,同时运行的程序的不同实例可能具有相同的虚拟地址,但它们不会具有相同的物理地址。

一些系统,例如 OpenBSD 或具有各种强化设置的 Linux,实现了地址空间布局随机化 (ASLR)。ASLR 意味着每次进程启动时,其代码、数据、堆栈和堆的虚拟地址都是随机确定的。这是一项安全功能,旨在使安全漏洞的利用更加困难:利用代码不能只访问已知地址的已知代码。然而,随着 ASLR 变得越来越流行,漏洞利用也变得更加复杂以解决它。ASLR 仍然很有用,因为它增加了漏洞利用编写者的工作量,而不会增加很多复杂性。

于 2011-05-07T11:56:51.337 回答
0

可能不会,但他们可能会。每个进程都有自己独立的内存空间。

于 2011-05-07T10:31:07.057 回答