c - 程序的虚拟地址空间有多大?
问题描述
我正在阅读操作系统:三个简单的部分。为了了解程序的虚拟地址空间是什么样子,我运行以下代码。
#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 位宽)它有什么意义?
解决方案
可能的虚拟地址空间组织由您使用的硬件定义,特别是它支持的 MMU。然后操作系统可以使用可以强制硬件使用的任何组织,但通常它只是直接使用它(可能带有一些子集),因为这是最有效的。
x86_64 体系结构定义了一个 48 位的虚拟地址空间1,并且大多数操作系统保留其中的一半供系统使用,因此用户程序看到的是 47 位的地址空间。在该地址空间内,大多数操作系统将随机化用于任何给定程序的地址,以便更难利用程序中的错误。
1严格来说,该架构定义了一个 64 位的虚拟地址空间,但随后将所有没有前 17 位的地址都保留为全 0 或全 1。
推荐阅读
- python - 从字典中调用函数
- python-3.x - 是否可以仅从 auth_key 开始创建 Telethon 客户端?
- c# - 带有 React 应用程序的 ASP.NET 身份在 OAuth2 回调中中断
- python - 如何在 for 循环中创建一个列表,以便我的所有三个爱好都在其中?
- vba - 是否可以在 excel vba 中使用 for next 循环遍历 sapgui 数组?
- php - Symfony4 控制器路由注释中的动态前缀
- postgresql - “不存在”和“不存在”有什么区别
- python - Python RegEx 在分隔符之前和之后将文本与整个文本分组?
- sapui5 - 选择带Growing=True 的隐藏列表项
- c# - 如何在实体框架中使用 lambda 表达式进行此查询?