虚拟内存中0x400000下有什么?



在学习Linux操作系统时,我知道以下几点:

  1. 实模式将使用0x10000以下的地址
  2. 保护模式32bit使用4G,用户空间可以使用2/3 G
  3. 程序的虚拟内存将从0x40000开始到更高

那么,0x400000以下是什么,是保留的吗?

正如Maxim所说,它只是没有映射。该区域中的页面被标记为";不存在";在CPU的页面表中,因此访问它们会导致页面故障;并且内核知道它们没有任何物理内存、文件或交换空间支持,所以这样的页面故障将通过向进程传递分段故障信号(SIGSEGV(来处理,通常会杀死它

希望至少程序的虚拟地址空间的最低页面被取消映射,这样对地址0的访问(空指针取消引用(将导致分段故障,而不是允许有缺陷的程序继续运行。保留一个较大的区域未映射也是很好的,例如,如果程序试图访问p[i],其中p是空指针,而i略大于4096,则程序将再次获得segfault。在32位模式中,值0x400000很方便,因为它是4MB,并且对应于页面目录中的一个条目。看见https://wiki.osdev.org/Paging介绍x86分页。

那么,0x400000下有什么,是保留的吗?

这是没有映射任何物理内存的虚拟地址空间。有关详细信息,请参阅页表。

您可以使用查看进程的虚拟地址空间映射

cat /proc/<pid>/maps

0x400000的基地址在某种程度上是任意的,地址空间随机化(默认启用(在每次运行时加载不同地址的可执行文件。您可以通过运行两次cat /proc/self/maps来观察地址空间随机化的效果,并观察每次运行时在不同的虚拟地址加载cat可执行文件(前提是cat是可执行文件,而不是内置的shell(。

最小虚拟地址由vm.mmap_min_addrsysctl变量控制。在Ubuntu 18.04.5 LTS上,它的默认值是65536(十六进制的0x10000(。

最新更新