首页 > 解决方案 > 程序的虚拟地址空间有多大?

问题描述

我正在阅读操作系统:三个简单的部分。为了了解程序的虚拟地址空间是什么样子,我运行以下代码。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
    printf("location of code : %p\n", (void *) main);
    printf("location of heap : %p\n", (void *) malloc(1));
    int x = 3;
    printf("location of stack : %p\n", (void *) &x);
    return x;
}

它的输出是:

location of code : 0x564eac1266fa
location of heap : 0x564ead8e5670
location of stack : 0x7fffd0e77e54

为什么代码段的位置是0x564eac1266fa?这么大的(虚拟)空间在使用之前有什么用?为什么不从或附近开始0x0

而且,为什么程序的虚拟地址这么大?(从堆栈位置来看,它是 48 位宽)它有什么意义?

标签: ccompilationoperating-system

解决方案


可能的虚拟地址空间组织由您使用的硬件定义,特别是它支持的 MMU。然后操作系统可以使用可以强制硬件使用的任何组织,但通常它只是直接使用它(可能带有一些子集),因为这是最有效的。

x86_64 体系结构定义了一个 48 位的虚拟地址空间1,并且大多数操作系统保留其中的一半供系统使用,因此用户程序看到的是 47 位的地址空间。在该地址空间内,大多数操作系统将随机化用于任何给定程序的地址,以便更难利用程序中的错误。


1严格来说,该架构定义了一个 64 位的虚拟地址空间,但随后将所有没有前 17 位的地址都保留为全 0 或全 1。


推荐阅读