OS 是否使用内存地址 0x0?
Does the OS Use Memory Address 0x0?
我的理解是,典型的用户程序永远不会使用内存中的早期地址,因为这些地址通常由 OS 保留。
但是,OS 是否使用 0x0
或者甚至那些将此地址观察为 nullptr
的人?
从应用程序程序员的角度来看,在许多系统上,第一页或几页似乎无法访问。
这通常是程序加载器的一个功能。加载程序将应用程序放入内存时会跳过前 N 页。因此,它们在逻辑地址空间中没有映射。此约定用于检测杂散的空指针引用。
我想不出任何保留这些页面的操作系统。应用程序可以根据需要映射低页。
虽然典型程序 "typical" 程序不使用此地址范围,但非典型程序可能。
通常(至少在Meltdown之前),内核映射本身在每个用户-space进程虚拟寻址space.
大多数内核将自己置于内存的上半部分。这意味着 0x0
地址在技术上是用户 space 保留寻址的一部分。
无论如何,鉴于NULL
指针的特殊含义,0x0
地址不应该被任何人使用。
实际上,某些内核(例如 Linux 正确配置时)会阻止您在地址 space(包括 0x0
)的开头分配任何内容。这是一种安全措施,事实上,如果有人将某些东西分配给 0x0
地址(或后续地址),内核中的任何 NULL-dereference 错误都会成为危险的可利用漏洞(如果缺少其他更新的安全措施,如 SMEP 和类似措施)。
我的理解是,典型的用户程序永远不会使用内存中的早期地址,因为这些地址通常由 OS 保留。
但是,OS 是否使用 0x0
或者甚至那些将此地址观察为 nullptr
的人?
从应用程序程序员的角度来看,在许多系统上,第一页或几页似乎无法访问。
这通常是程序加载器的一个功能。加载程序将应用程序放入内存时会跳过前 N 页。因此,它们在逻辑地址空间中没有映射。此约定用于检测杂散的空指针引用。
我想不出任何保留这些页面的操作系统。应用程序可以根据需要映射低页。
虽然典型程序 "typical" 程序不使用此地址范围,但非典型程序可能。
通常(至少在Meltdown之前),内核映射本身在每个用户-space进程虚拟寻址space.
大多数内核将自己置于内存的上半部分。这意味着 0x0
地址在技术上是用户 space 保留寻址的一部分。
无论如何,鉴于NULL
指针的特殊含义,0x0
地址不应该被任何人使用。
实际上,某些内核(例如 Linux 正确配置时)会阻止您在地址 space(包括 0x0
)的开头分配任何内容。这是一种安全措施,事实上,如果有人将某些东西分配给 0x0
地址(或后续地址),内核中的任何 NULL-dereference 错误都会成为危险的可利用漏洞(如果缺少其他更新的安全措施,如 SMEP 和类似措施)。