我在32位机器上。据我了解,用户空间的地址范围从0x00000000
到0xbfffffff
,内核的范围从0xc0000000
到0xffffffff
。
但是当我使用pmap查看进程的内存分配时,我发现该库是在0xf7777777
左右加载的。请参阅随附的屏幕截图。是否意味着这些库是在内核空间中加载的?当我使用mmap()
时,我从0xe0000000
获得了地址。那么,mmap()
从内核空间获得了内存吗?
答案 0 :(得分:0)
我在32位机器上。据我所知,用户空间的地址 范围从0x00000000到0xbfffffff,内核的范围从 0xc0000000到0xffffffff。
不完全是。内核内存空间从0xC0000000
开始,但它不必填充整个GB。实际上,它填充了虚拟地址0xF7FFFFFF
。这涵盖了896MB
物理内存。虚拟地址0xF8000000
及以上用作内核的128MB
窗口,以映射超出896MB
限制的物理内存区域。
所有用户进程共享虚拟地址0xC0000000
及更高版本的相同内存映射,因此如果内核不使用其整个GB的虚拟空间,则可能会重用其中一部分来映射常用的共享库,因此每个过程都可以看到它们。