如果启用了页面转换并且虚拟地址0处的内存不可访问(由于物理内存映射到虚拟地址空间的方式),在x86/64上,1 ... 4095将不可访问因为所有这些4096个地址都对应一页内存,并且它只能作为一个整体可用或不可用。永远不要在虚拟地址0映射内存是一个好主意。不映射它将有助于捕获许多空指针解引用。这里的CPU会在未映射的位置或要求比当前正在执行的代码更高权限的位置上生成页面错误(aka #PF)。
在64位模式下,CPU可能实现的虚拟地址位数少于(48+),而64位地址必须包含未实现的位中的全零或全1(值为0或1,必须与最重要的实现地址位的值相同,所有这些都可以解释为地址符号扩展)。这些地址称为规范。如果您尝试使用非规范地址读取或写入内存,则会出现一般性保护错误(AKA #GP)。
因此,根据操作系统(有效地,在其内存布局上)和实际的CPU,您可能会提出一系列“无效”内存地址。如果您尝试从用户模式应用程序读取/写入内核内存,您将获得#PF。如果您尝试读取/写入未映射的内存(例如,在地址0到4095),您将获得#PF。如果您尝试读取/写入非规范地址,您将获得#GP。
这是你要找的那种东西吗?