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

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

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

在这里输入图像说明

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

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

所有用户进程共享虚拟地址0xC0000000及以后的内存映射,所以如果内核不使用其全部的虚拟空间,可以重用部分映射常用的共享库,这样每个进程都可以看到它们。