我在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