複製鏈接
請複製以下鏈接發送給好友

用户空間

鎖定
操作系統中,虛擬內存通常會被分成用户空間(又稱使用者空間),與核心空間這兩個區塊。
中文名
用户空間
外文名
User space
別    名
使用者空間
相關術語
核心空間
學    科
計算機科學

用户空間用户空間概述

Linux系統將自身劃分為兩部分,一部分為核心軟件,即是kernel,也稱作內核空間,另一部分為普通應用程序,這部分稱為用户空間。
用户空間中的代碼運行在較低的特權級別上,只能看到允許它們使用的部分系統資源,並且不能使用某些特定的系統功能,也不能直接訪問內核空間和硬件設備,以及其他一些具體的使用限制。

用户空間定義

操作系統中,虛擬內存通常會被分成用户空間(英語:User space,又譯為使用者空間),與核心空間(英語:Kernel space,又譯為內核空間)這兩個區塊。
這是存儲器保護機制中的一環。
內核、核心擴充(kernel extensions)、以及驅動程序,運行在核心空間上。
而其他的應用程序,則運行在用户空間上。
所有運行在用户空間的應用程序,都被統稱為用户級(userland)。

用户空間linux中的用户空間與內核空間

linux驅動程序一般工作在內核空間,但也可以工作在用户空間。
Linux簡化了分段機制,使得虛擬地址與線性地址總是一致,因此,Linux的虛擬地址空間也為0~4G。Linux內核將這4G字節的空間分為兩部分:
將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為“內核空間”;
而將較低的3G字節(從虛擬地址 0x00000000到0xBFFFFFFF),供各個進程使用,稱為“用户空間 [1]  )。
因為每個進程可以通過系統調用進入內核,因此,Linux內核由系統內的所有進程共享。於是,從具體進程的角度來看,每個進程可以擁有4G字節的虛擬空間。
Linux使用兩級保護機制:0級供內核使用,3級供用户程序使用。每個進程有各自的私有用户空間(0~3G),這個空間對系統中的其他進程是不可見的。最高的1GB字節虛擬內核空間則為所有進程以及內核所共享。
內核空間中存放的是內核代碼和數據,而進程的用户空間中存放的是用户程序的代碼和數據。不管是內核空間還是用户空間,它們都處於虛擬空間中。
雖然內核空間佔據了每個虛擬空間中的最高1GB字節,但映射到物理內存卻總是從最低地址(0x00000000)開始。對內核空間來説,其地址映射是很簡單的線性映射,0xC0000000就是物理地址與線性地址之間的位移量,在Linux代碼中就叫做PAGE_OFFSET。

用户空間內核空間和用户空間之間如何進行通訊?

內核空間和用户空間一般通過系統調用進行通信。

用户空間用户模式驅動內核模式驅動的判斷及標準

用户空間模式的驅動一般通過系統調用來完成對硬件的訪問,如通過系統調用將驅動的io空間映射到用户空間等。
因此,主要的判斷依據就是系統調用。
內核空間和用户空間上不同太多了,比如用户態的鏈表和內核鏈表不一樣;用户態用printf,內核態用printk;用户態每個應用程序空間是虛擬的,相對獨立的,內核態中卻不是獨立的,所以編程要非常小心等等。
還有用户態和內核態程序通訊的方法很多,不單單是系統調用,實際上系統調用是個不好的選擇,因為需要系統調用號,這個需要統一分配。可以通過ioctl、sysfs、proc等來完成。
參考資料