假设我正在启动同一程序的两个实例。两个程序的文本区域是否都具有相同的虚拟地址?
答案 0 :(得分:1)
取决于。在大多数系统上,如果在同一环境中运行相同的程序两次(相同的参数等),您将找到相同的地址映射。这只是因为该过程所做的大部分工作都是确定性的,仅取决于环境,命令行参数,读取的文件内容,而不取决于更改数据(如日期或进程ID)。这在调试时非常有用:如果重新启动程序,有时甚至在代码更改和重新编译之后,内存布局仍然保持不变。当然,并发运行的程序的不同实例可能具有相同的虚拟地址,但它们不具有相同的物理地址。
某些系统(如OpenBSD或具有各种加固设置的Linux)实现address space layout randomization (ASLR)。 ASLR意味着每次进程启动时,其代码,数据,堆栈和堆的虚拟地址都是随机确定的。这是一个安全功能,旨在使安全漏洞的利用更加困难:漏洞利用代码不能只访问已知地址的已知代码。然而,随着ASLR变得越来越流行,攻击也变得更加复杂。 ASLR仍然有用,因为它增加了漏洞编写器的工作量,而不会增加很多复杂性。
答案 1 :(得分:0)
可能不是,但他们可能会这样做。每个进程都有自己独立的内存空间。