【问题标题】:Lower reserved portion of virtual address space虚拟地址空间的较低保留部分
【发布时间】:2021-01-06 10:41:32
【问题描述】:

我一直在研究 x86-64 汇编和程序的内存布局。

我遇到了一个程序的虚拟地址空间示例,其中较低部分 (0x00000000-0x00010000) 被标记为保留。但我找不到对此的解释。

我有两个问题

  1. 为什么要保留这部分。我真的不能从我的程序中访问它吗?这个较低的部分被算作用户空间内存。所以我不明白为什么我无法使用它
  2. 这个保留部分是做什么用的?

【问题讨论】:

  • 前 64 kB 被保留,因此取消引用空指针或从空指针派生的指针可能会导致程序崩溃。
  • 在linux上你可以通过/proc/sys/vm/mmap_min_addr调整它。
  • @fuz:由 Linux 内核保留,而不是 x86-64 ISA。 wiki.debian.org/mmap_min_addr 指出 WINE 可能需要将该范围用于 16 位 Windows 二进制文件。

标签: assembly x86-64 virtual-address-space


【解决方案1】:

我真的不能从我的程序中访问它吗?

在 32 位模式下,x86 CPU 可以使用“分页”,在 64 位模式下(操作系统)x86 CPU 必须使用此功能。

大大简化,“分页”是大型 CPU 的一项功能(像“Arduino”这样的设备没有此功能),它允许告诉 CPU 硬件 RAM 中的哪个地址实际上是由某个地址访问的。

发明了分页来处理以下情况:

假设您编写了一些应用程序(可能是文本编辑器),它在地址 0x123456 处存储了一些值,并且您同时运行该程序两次。

在这种情况下,您通常会认为一个程序确实不会覆盖另一个程序存储的数据,尽管两个程序都将数据存储在地址 0x123456。

操作系统使用“分页”告诉 CPU,一个程序在访问地址 0x123456 时实际上应该访问 RAM 硬件中的某个地址(可能是 0x200456),而另一个程序在访问地址时应该访问 RAM 硬件中的另一个地址(可能是 0x300456) 0x123456,因此两个程序不会覆盖另一个程序的数据,尽管两个程序使用相同的地址(0x123456)。

操作系统也可能告诉 CPU 一些内存区域(例如 0-0x1000)根本没有使用。这意味着 CPU 在尝试访问该地址时不会执行任何内存访问,但它会“引发异常”,这意味着通过调用操作系统中的某些函数来通知操作系统。 p>

操作系统可能会更改“分页”的配置并继续程序或停止程序并打印一些错误消息。

“保留”显然意味着操作系统将停止程序并显示一些错误消息。

这个保留部分是做什么用的?

我认为这里的“保留”只是意味着:“未使用”而不是:“保留以备将来使用”。

为什么要保留这部分。 ...

正如用户“fuz”在他的评论中所建议的那样,在大多数现代编程语言中,地址零用于指定未指定参数。

一些例子:

如果指定了文件名,此函数将返回某个文件的长度。如果未指定文件名,则返回最后打开的文件的长度。寄存器rcx为文件名存放地址;如果寄存器rcx 为零,则表示没有指定文件名。

在本例中,如果您感兴趣的文件名存储在地址 0 处,则会出现问题。

出于这个原因,许多操作系统不使用“低”内存区域(从 0 开始),因此可以保证地址“零”不指定任何有效数据。

【讨论】:

  • 在 0 附近保留整个范围的一个很好的理由是数组:return arr[x]; 如果 arr 为 NULL 并且 x 不小,您希望它仍然会出错。否则你会奇怪为什么不只保留零页本身。 (Linux还保留了虚拟地址空间的最顶层:Why can't I mmap(MAP_FIXED) the highest virtual page in a 32-bit Linux process on a 64-bit kernel?
  • 我觉得这个答案需要很长时间才能达到重点(并且没有花足够的时间在那里)。它甚至没有提到 NULL 指针,这是许多语言中的一个重要概念,作为确保 0 不被用作有效地址的讨论的一部分。在您解释什么是分页和内存保护之前,也许至少在顶部有一个 TL:DR。 (如果有必要的话)。我有点认为 fuz 的评论是一个比这更好的整体答案,即使它是如此简短。至少对于已经了解一些分页基础知识的读者而言。
  • @PeterCordes 不幸的是,OP 一次问了多个问题。问题“我真的不能从我的程序中访问它吗?”如果不解释什么是分页,就无法回答(不幸的是,这是我回答中最长的部分)。当我写答案时,我正在考虑arr[x] 的案例,但我没有提及它,因为在这种情况下我的答案会更长。
  • 好吧,这很公平,看看问题中的那个短语确实让我重新考虑我对 OP 对虚拟内存的理解水平的猜测,以及任何未映射的内存都会出现页面错误这一事实。
  • @PeterCordes 我没有提到“NULL指针”这个术语,因为它在不同的编程语言中的命名不同(例如nilnothing)。 OP问的是汇编语言,所以我不想使用编程语言特定的术语,我只是在谈论具有特殊含义的“地址零”。
猜你喜欢
  • 2016-01-13
  • 2021-03-18
  • 2014-01-16
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
相关资源
最近更新 更多