2015-04-03 144 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