【问题标题】:Do pointers refer to physical or to virtual memories?指针是指物理内存还是虚拟内存?
【发布时间】:2019-08-20 07:07:56
【问题描述】:

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

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

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

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]);

【问题讨论】:

  • 实际上,这取决于。如果您使用的是没有虚拟内存的操作系统,或者您正在编写(部分)内核代码,它将指向物理地址。如果您正在编写一个将在操作系统之上运行的应用程序,也就是说,在用户模式下并且操作系统使用虚拟内存,它将指向一个虚拟地址。更多信息请参见stackoverflow.com/questions/26585788/…
  • 程序使用了一个指针,因此它必须具有程序所见的地址。如果系统为程序创建了虚拟地址空间,则程序使用虚拟地址。

标签: c pointers memory virtual


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    这是否意味着数组实际上是在 RAM 中的“行”形式,或者它们有可能被分配到稀疏区域并且操作系统只是假装程序员?

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

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

    【讨论】:

    • 你确定1KiB数组是连续的吗?它可以从一页开始并在下一页继续吗?
    • @Broman "一个 1 KiB 数组(其起始地址至少对齐 1 KiB)" -- 假设 4 KiB 页面大小,如果 1 KiB 块为 1 KiB 对齐,它将恰好适合该页面上的四个“插槽”之一。
    • 非常感谢!!它真的帮助了我:)
    猜你喜欢
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2011-06-08
    相关资源
    最近更新 更多