我在32位机器上。 据我所知,用户空间的地址范围从0x00000000
到0xbfffffff
,内核范围从0xc0000000
到0xffffffff
。
但是,当我使用pmap来查看进程的内存分配时,我发现库被加载在0xf7777777
左右。 请参阅附件截图。 这是否意味着这些库被加载到内核空间中? 而当我使用mmap()
,我得到了0xe0000000
的地址。 那么, mmap()
从内核空间获取内存?
我在32位机器上。 据我所知,用户空间的地址范围从0x00000000到0xbfffffff,内核范围从0xc0000000到0xffffffff。
不完全是。 内核内存空间从0xC0000000
开始,但不一定要填满整个GB。 实际上,它填充到虚拟地址0xF7FFFFFF
。 这涵盖了896MB
的物理内存。 虚拟地址0xF8000000
及以上用作内核的128MB
窗口,用于映射超出896MB
限制的任何物理内存区域。
所有用户进程共享虚拟地址0xC0000000
及以后的内存映射,所以如果内核不使用其全部的虚拟空间,可以重用部分映射常用的共享库,这样每个进程都可以看到它们。