我知道虚拟内存在Windows中将2G(针对内核)/ 2G(针对用户)分开。 但为什么变量的地址不是连续堆栈?
喜欢0x22ff74,0x22ff78,0x22ff82,0x22ff86?这是否意味着Windows在用户进程中使用沙盒机制?
答案 0 :(得分:14)
这正是虚拟内存的含义。操作系统为每个程序提供自己的专用地址空间。实际上,操作系统负责将这些虚拟地址映射回物理地址空间,而无需应用程序知晓。
正如您所注意到的,这意味着两个应用程序可以在程序中的同一虚拟地址中拥有不同的数据。
详细了解虚拟内存here。
答案 1 :(得分:3)
您是否混淆了物理地址和虚拟地址?两个进程可以访问同一个虚拟地址,因为每个进程都可以看到自己的虚拟内存空间。另一方面,所有进程在机器中共享相同的物理内存空间,因此每个进程将具有映射到不同物理地址的相同虚拟地址(假设没有共享内存)。
答案 2 :(得分:0)
让我以另一种方式阐述它。进程X在机器A上运行,同一程序在机器B上作为进程Y运行。如果程序的某个全局变量在两台机器上占用相同的内存地址,这是否重要?它们是不同的!同样,如果该全局变量存储在一个进程实例的XYZ位置,则另一个进程实例可能具有该全局变量的相同虚拟地址(XYZ)。