2015-04-03 136 views
0

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

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

enter image description here

+0

您安装了多少物理RAM? – 2015-04-03 05:07:19

+0

@mcleod_ideafix这与它有什么关系?这是关于虚拟内存,而不是物理的。 – Barmar 2015-04-03 05:11:18

+0

请参阅http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/ – Barmar 2015-04-03 05:14:27

回答

0

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

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

所有用户进程共享虚拟地址0xC0000000以及之后的相同内存映射,所以如果内核不使用其全部GB虚拟空间,它可能会重用部分映射常用共享库,因此每个进程都可以看他们。

+1

一些相关的内核源代码: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