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

Do pointers refer to physical or to virtual memories?

我最近了解到计算机程序实际上并不使用物理内存的地址。相反,我知道物理内存是由操作系统 'hidden' 提供给应用程序的。

我的问题来了: 指针return是物理内存地址还是虚拟内存地址?

如果我执行下面的代码,我会得到一个十六进制形式的地址。它只是操作系统随机分配的一个数字吗?而且,我发现数组中元素的地址是连续分配的。这是否意味着数组在 RAM 中实际上是 'line' 形式,或者它们是否可能被分配到稀疏区域并且 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]);

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

在所有现代OSes(Windows、Linux、BSD 等)中,所有地址 在一个用户space 应用程序是虚拟地址。某些 RTOSes 或其他自定义裸机应用程序除外。

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

Does this mean that an array is actually in a 'line' form in the RAM, or is it possible for them to be assigned in sparse regions and the OS merely fakes the programmer?

两者都有。 OS 创建 内存的物理到虚拟映射,而不是单个地址。页面大小因体系结构而异,但通常为 4 KiB。

因此,如果您有一个 1 KiB 数组(其起始地址至少对齐 1 KiB),它将在物理上是连续的。然而,一个 16 KiB 的数组可能分散在 4 个彼此相距很远的页面上。