为什么在我的C程序中虚拟地址这么大



我最近了解了虚拟内存和分页,编译器只生成从1开始并简单向上计数的虚拟地址。我想我应该测试一下,并在下面写了一个简短的C程序,它实例化一个全局变量并打印它的地址,期望值很小,因为CPU只看到虚拟地址,但我得到了4247584。这里发生了什么,我的假设错了吗?如果可能的话,什么程序可以显示从1开始生成的虚拟地址?

我的程序:

#include <stdio.h>
int x = 0;
int main(){
printf("%dn", &x);
return 0;
}

(我在Windows 10上使用gcc 4.8.1(

虚拟地址的实际相对来说不是必需的(好吧,因为它是虚拟的(。没有什么"浪费的";当它不从0开始时。地址值的唯一前提条件是程序、数据及其所有相关的共享库实际适合值空间。

然而,出于安全原因,在虚拟地址空间中以潜在攻击者不可复制的方式分配进程的各种代码和数据区域是有意义的(这使得在固定地址进行代码注入攻击几乎不可能(,这就是为什么现代操作系统为程序随机分配虚拟地址空间值的原因。

在一些操作系统(如Linux(上,您可以关闭虚拟地址空间布局随机化,从而使其可复制。地址很可能仍然不会从零开始,因为库和启动代码占用的地址很可能低于您自己的程序。

最新更新