指针指的是物理存储还是虚拟存储?

问题描述 投票:3回答:2

我最近了解到计算机程序实际上并没有使用物理内存的地址。相反,我理解操作系统对应用程序“隐藏”物理内存。

我的问题出现了:指针是否返回物理内存或虚拟内存的地址?

如果我执行下面的代码,我会得到一个十六进制形式的地址。它只是一个由操作系统随机分配的数字吗?而且,我发现数组中元素的地址是连续分配的。这是否意味着数组实际上是在RAM中的“行”形式,或者它们是否可能在稀疏区域中分配,而OS只是伪造程序员?

int num = 3;
int arr[3];

printf("address of num: 0x%0x \n", &num);
printf("&arr[0]: 0x%0x \n", &arr[0]);
printf("&arr[1]: 0x%0x \n", &arr[1]);
printf("&arr[2]: 0x%0x \n", &arr[2]);
c pointers memory virtual
2个回答
5
投票

在所有现代操作系统(Windows,Linux,BSD等)中,用户空间应用程序中的所有地址都是虚拟地址。例外情况是某些RTOS或其他自定义裸机应用程序。

虚拟地址不一定是随机的,但从硬件的角度来看,它们是任意的。内核通常会决定为给定的映射请求分配的虚拟地址空间,有时会考虑用户空间请求。当使用像ASLR这样的东西时(现在很常见),地址是有意随机的。

这是否意味着数组实际上是在RAM中的“行”形式,或者它们是否可能在稀疏区域中分配,而OS只是伪造程序员?

都。操作系统创建内存页面的物理到虚拟映射,而不是单个地址。页面大小因架构而异,但通常为4 KiB。

因此,如果你有一个1 KiB数组(其起始地址至少为1 KiB对齐),它将是物理上连续的。然而,一个16 KiB阵列可能分散在4页之间,这些页面彼此不远。


1
投票

这取决于操作系统。但主要是(在大多数操作系统上)它们是逻辑地址。有虚拟内存,寻呼等操作系统机制用于地址转换。通常这样做是为了确保不允许程序覆盖部分内存。如果您在没有操作系统的裸机内核上运行它来处理虚拟地址。它将是物理地址。如果它作为OS上的应用程序运行,您将获得虚拟地址。

© www.soinside.com 2019 - 2024. All rights reserved.