Linux进程虚拟地址空间的地址范围

时间:2015-04-03 05:03:30

标签: c linux

我在32位机器上。据我了解,用户空间的地址范围从0x000000000xbfffffff,内核的范围从0xc00000000xffffffff

但是当我使用pmap查看进程的内存分配时,我发现该库是在0xf7777777左右加载的。请参阅随附的屏幕截图。是否意味着这些库是在内核空间中加载的?当我使用mmap()时,我从0xe0000000获得了地址。那么,mmap()从内核空间获得了内存吗?

enter image description here

1 个答案:

答案 0 :(得分:0)

  

我在32位机器上。据我所知,用户空间的地址   范围从0x00000000到0xbfffffff,内核的范围从   0xc0000000到0xffffffff。

不完全是。内核内存空间从0xC0000000开始,但它不必填充整个GB。实际上,它填充了虚拟地址0xF7FFFFFF。这涵盖了896MB物理内存。虚拟地址0xF8000000及以上用作内核的128MB窗口,以映射超出896MB限制的物理内存区域。

所有用户进程共享虚拟地址0xC0000000及更高版本的相同内存映射,因此如果内核不使用其整个GB的虚拟空间,则可能会重用其中一部分来映射常用的共享库,因此每个过程都可以看到它们。