我在32位机器上。据我所知,用户空间的地址范围从0x00000000
到0xbfffffff
,内核的范围从0xc0000000
到0xffffffff
。Linux进程虚拟地址空间的地址范围
但是,当我使用pmap来查看进程的内存分配时,我发现该库被加载在0xf7777777
左右。请参阅附件截图。这是否意味着这些库被加载到内核空间中?当我使用mmap()
时,我从0xe0000000
得到地址。那么,mmap()
从内核空间获得内存?
我在32位机器上。据我所知,用户空间的地址范围从0x00000000
到0xbfffffff
,内核的范围从0xc0000000
到0xffffffff
。Linux进程虚拟地址空间的地址范围
但是,当我使用pmap来查看进程的内存分配时,我发现该库被加载在0xf7777777
左右。请参阅附件截图。这是否意味着这些库被加载到内核空间中?当我使用mmap()
时,我从0xe0000000
得到地址。那么,mmap()
从内核空间获得内存?
我的32位机器上。据我所知,用户空间的地址 范围从0x00000000到0xbfffffff,内核的范围从 0xc0000000到0xffffffff。
不完全是。内核内存空间从0xC0000000
开始,但不必填满整个GB。实际上,它填充虚拟地址0xF7FFFFFF
。这包括物理内存的896MB
。虚拟地址0xF8000000
及以上用作内核的128MB
窗口,用于映射超出896MB
限制的任何物理内存区域。
所有用户进程共享虚拟地址0xC0000000
以及之后的相同内存映射,所以如果内核不使用其全部GB虚拟空间,它可能会重用部分映射常用共享库,因此每个进程都可以看他们。
一些相关的内核源代码:http://lxr.free-electrons.com/source/arch/x86/include/asm/processor.h?v=3.19#L839 http://lxr.free-electrons.com/source /arch/x86/Kconfig?v=3.19#L1238 – o11c 2015-04-03 05:51:53
您安装了多少物理RAM? – 2015-04-03 05:07:19
@mcleod_ideafix这与它有什么关系?这是关于虚拟内存,而不是物理的。 – Barmar 2015-04-03 05:11:18
请参阅http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/ – Barmar 2015-04-03 05:14:27