天天看點

如何看待Linux作業系統的使用者空間和核心空間

作為中央核心處理單元的cpu,除了生産工藝的不斷革新進步外,在處理資料和響應速度方面也需要有權衡。稍有微機原理基礎的人都知道intel x86體系的cpu提供了四種特權模式ring0~ring3,其中ring0特權最高,ring3的特權最低,之是以要做這樣的區分一個主要目的是保護資源,通俗來講要保護的資源無非就是“記憶體、i/o端口以及執行特殊機器指令的能力”。任何一個時刻,x86 cpu都是在一定的特權模式下運作。同樣,對于arm體系的cpu 一共有七種運作模式,分别是:使用者模式(usr)、快速中斷模式(fiq)、中斷模式(irq)、管理模式(svc)、系統模式(sys)、資料通路終止模式(abt)和未定義指令終止模式(und)。除了使用者模式外,其他6中工作模式都屬于特權模式,而特權模式中除了系統模式外,其他5種模式又稱為異常模式。

那麼底層硬體cpu的這種特性,跟我們将要讨論的使用者模式和核心模式又有什麼關系呢?讓我們正本溯源來端正一下對作業系統的認識。每位教作業系統課程的老師都會告訴大家:所謂的作業系統呢,就是對硬體資源進行統一管理的系統,并向使用者提供業務接口的軟體系統。通俗來講,【作業系統就是要能管理你的cpu和記憶體,驅動你的硬碟,管理你的網卡和顯示器,然後當你點選滑鼠和敲擊鍵盤時能做出正确的響應。】夠通俗了吧。

那麼問題就來了,以cpu為例,如果你是一個作業系統的設計者,你會如何處理不同cpu體系架構的差異性(如intel、arm,抑或amd、mips等)?當然這個問題不是一般人能hold得了的,cu論壇裡開發都江堰作業系統那位大牛前輩确實值得讓吾輩佩服和敬仰。繼續我們的話題,也就是說不同的作業系統在處理cpu體系架構的差異化方面是不相同的,有些作業系統,就提供了使用者模式和核心模式這種機制 (例如linux),而有些作業系統呢,又沒有使用者态和核心态之分(例如vxworks)。後者不在我們的讨論範圍,感興趣的童鞋可以自己去google一下。

以linux系統和intel x86的cpu為例,linux使用了ring0模式來運作核心态的代碼,ring3來運作使用者态的代碼,ring1和ring2沒有使用。32為作業系統可尋址範圍是0~4gb,為此linux系統将其分為了使用者空間和核心空間兩部分:

如何看待Linux作業系統的使用者空間和核心空間

其中使用者空間占低位的3gb空間,範圍從虛拟位址的0x00000000到0xbffffffff,核心空間占用了高位的1gb空間,虛拟位址範圍從0xc0000000到0xffffffff。

核心空間裡存放的是整個核心代碼和所有核心子產品,以及核心所維護的資料。當使用者運作一個程式時,該程式所建立的程序一開始是運作在使用者空間的,當它要執行網絡發送資料等動作時,必須通過調用write、send等系統函數來完成,這些系統調用會去調用核心中的代碼來完成使用者的請求操作,這時cpu必須從ring3切換到ring0,然後進入核心位址空間去執行這些代碼完成操作,完成後又切換回ring3,回到使用者态。

是以,我們可以看到,提供了使用者模式和核心模式的作業系統,使用者态的程式就不能随意操作核心位址空間裡的資料,具有一定的安全保護作用;于此同時,在實時性方面稍微有所犧牲。也要就是說,隻要核心代碼沒有問題,使用者空間程式的錯誤和bug一般來說不會導緻系統崩潰,提高了系統的健壯性。

這麼看來,核心确實比較“拽”,而linux也提供了一些使用者空間和核心空間通訊的機制,使我們可以開發出更高效的程式。但一定要記住,核心中一點小小的錯誤都是會導緻整個系統崩潰,是以開發核心程式時一定要非常小心謹慎。

本文作者:佚名

來源:51cto

繼續閱讀