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