Linux操作系統采用虛擬內存管理技術,使得每個進程都有各自互不干涉的進程地址空間。32位linux下,該空間是塊大小為4G的線性虛擬空間,1G的內核地址空間,3G的用戶地址空間。
3G的用戶地址空間訪問最大3G的物理內存地址,1G的內核地址空間可訪問全部的物理內存地址。
那么內核進程的虛擬地址空間怎么划分的?這個進程應該沒有用戶地址空間吧?是4G都給內核地址空間了嗎?
14 个解决方案
樓主的問題應該是在與虛擬空間和物理空間的具體區別。
1.虛擬空間:
可以說虛擬空間是用來欺騙高性能MCU的,往往通過mmu來將虛擬空間轉化內存空間的。往往跑的了linux的都需要mmu。
2.物理空間:
簡單來說就是控制MCU電路的。比方說你的處理器是32位,尋址空間是0~0xffffffff.你的內存的尋址空間是0x30000000~0x40000000(這里的內存是物理內存地址).其余的尋址空間是用來控制電路的,比方說各種寄存器。
所以樓主的疑問應該是,用戶空間和內核空間都是在內存之內的,和內存頁表有關。
又不是一下全分配,用的着的時候才分配。
沒有用戶地址空間,切換進程得耗費多少空間。
程序裝載運行時,通過連接器將程序的地址和內存空間分配好,存放到目標文件數據段中,虛擬空間管理器將地址內存信息保存到一張表中,mmu通過這張表找到真實的內存空間
你的理解是對的
關於你的問題:
1,Linux中每個進程有兩個棧,分別用於用戶態和內核態的進程執行,一般都在用戶態下運行,當需要系統調用、異常、中斷時才會進入內核態。
2,進程執行時在物理內存中的實際地址,則由內核為其建立內存映射時臨時分配,具體地址取決於當時所分配的物理內存頁面,可能是連續的,也可能是不連續的空間
3,一般進程都是用戶態進程,桌面進程也屬於用戶態。只有在進程運行的時候才區分形態
有線程怎么可能沒有進程呢,每個進程至少有一個線程
不過linux下線程和windows下有些不一樣 ,你自己查查吧
32位操作系統,3G-4G為內核空間,0-3G為用戶態空間,內核只有線程,公用3-4G的虛擬地址空間,每個進程都有自己的0-3G空間,通過MMU的頁表控制,每個進程都有自己的頁表,所以對進程來說,自己獨有0-3G空間。
樓主可以看看這篇文章
http://www.cnblogs.com/clover-toeic/p/3754433.html