OS是否使用内存地址0x0?

时间:2018-07-14 15:30:25

标签: memory operating-system nullptr

我的理解是,典型的用户程序永远不会使用内存中的早期地址,因为这些地址通常是操作系统保留的地址。 但是,操作系统使用0x0还是使用nullptr来观察该地址?

2 个答案:

答案 0 :(得分:1)

通常(至少在 Meltdown 之前),内核会在每个用户空间进程虚拟寻址空间中映射

大多数内核将自己放置在内存的上半部分中。这意味着0x0地址在技术上是用户空间保留地址的一部分。

无论如何,鉴于NULL指针具有特殊含义,0x0地址不应被任何人使用。 实际上,某些内核(例如,正确配置的Linux)会阻止您在地址空间的开头(包括0x0)分配任何内容。这实际上是一种安全措施,实际上,如果有人将某些内容分配给0x0地址(或以下地址),则内核中的任何 NULL-dereference 错误均会成为危险的可利用漏洞(如果缺少其他最新的安全措施,如 SMEP 和类似的措施)。

答案 1 :(得分:-1)

从应用程序程序员的角度来看,在许多系统上,首页或几页似乎无法访问。

这通常是程序加载器的功能。当加载程序将应用程序放入内存时,它会跳过前N页。因此,它们在逻辑地址步调中没有映射。此约定用于检测杂散的空指针引用。

我想不出任何保留这些页面的操作系统。应用程序可以根据需要映射低页面。

尽管典型的程序“典型”程序不使用此地址范围,但非典型程序可能会使用。