linux內核空間和用戶空間詳解

 

linux驅動程序通常工做在內核空間,但也能夠工做在用戶空間。下面咱們將詳細解析,什麼是內核空間,什麼是用戶空間,以及如何判斷他們。
Linux簡化了分段機制,使得虛擬地址與線性地址老是一致,所以,Linux的虛擬地址空間也爲0~4G。Linux內核將這4G字節的空間分爲兩部分。將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱爲「內核空間」。而將較低的3G字節(從虛擬地址 0x00000000到0xBFFFFFFF),供各個進程使用,稱爲「用戶空間)。由於每一個進程能夠經過系統調用進入內核,所以,Linux內核由系統內的全部進程共享。因而,從具體進程的角度來看,每一個進程能夠擁有4G字節的虛擬空間。

    Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用。從圖中能夠看出(這裏沒法表示圖),每一個進程有各自的私有用戶空間(0~3G),這個空間對系統中的其餘進程是不可見的。最高的1GB字節虛擬內核空間則爲全部進程以及內核所共享。

  內核空間中存放的是內核代碼和數據,而進程的用戶空間中存放的是用戶程序的代碼和數據。不論是內核空間仍是用戶空間,它們都處於虛擬空間中。 
雖然內核空間佔據了每一個虛擬空間中的最高1GB字節,但映射到物理內存卻老是從最低地址(0x00000000)開始。對內核空間來講,其地址映射是很簡單的線性映射,0xC0000000就是物理地址與線性地址之間的位移量,在Linux代碼中就叫作PAGE_OFFSET。


內核空間和用戶空間之間如何進行通信? 
內核空間和用戶空間通常經過系統調用進行通訊。 


如何判斷一個驅動是用戶模式驅動仍是內核模式驅動?  判斷的標準是什麼? 

用戶空間模式的驅動通常經過系統調用來完成對硬件的訪問,如經過系統調用將驅動的io空間映射到用戶空間等。所以,主要的判斷依據就是系統調用。 
內核空間和用戶空間上不一樣太多了,說不完,好比用戶態的鏈表和內核鏈表不同;用戶態用printf,內核態用printk;用戶態每一個應用程序空間是虛擬的,相對獨立的,內核態中卻不是獨立的,因此編程要很是當心。等等。

還有用戶態和內核態程序通信的方法不少,不僅僅是系統調用,實際上系統調用是個很差的選擇,由於須要系統調用號,這個須要統一分配。 
能夠經過ioctl、sysfs、proc等來完成。

 

 

 

 

 

內核態和用戶態

 

 

 

當一個任務(進程)執行系統調用而陷入內核代碼中執行時,咱們就稱進程處於內核運行態(或簡稱爲內核態)。此時處理器處於特權級最高的(0級)內核代碼中執行。當進程處於內核態時,執行的內核代碼會使用當前進程的內核棧。每一個進程都有本身的內核棧。當進程在執行用戶本身的代碼時,則稱其處於用戶運行態(用戶態)。即此時處理器在特權級最低的(3級)用戶代碼中運行。當正在執行用戶程序而忽然被中斷程序中斷時,此時用戶程序也能夠象徵性地稱爲處於進程的內核態。由於中斷處理程序將使用當前進程的內核棧。這與處於內核態的進程的狀態有些相似。

 



進程上下文和中斷上下文

 

 

 

處理器總處於如下狀態中的一種: 一、內核態,運行於進程上下文,內核表明進程運行於內核空間; 二、內核態,運行於中斷上下文,內核表明硬件運行於內核空間; 三、用戶態,運行於用戶空間。 用戶空間的應用程序,經過系統調用,進入內核空間。這個時候用戶空間的進程要傳遞不少變量、參數的值給內核,內核態運行的時候也要保存用戶進程的一些寄存器值、變量等。所謂的「進程上下文」,能夠看做是用戶進程傳遞給內核的這些參數以及內核要保存的那一整套的變量和寄存器值和當時的環境等。 硬件經過觸發信號,致使內核調用中斷處理程序,進入內核空間。這個過程當中,硬件的一些變量和參數也要傳遞給內核,內核經過這些參數進行中斷處理。所謂的「中斷上下文」,其實也能夠看做就是硬件傳遞過來的這些參數和內核須要保存的一些其餘環境(主要是當前被打斷執行的進程環境)。
相關文章
相關標籤/搜索