1. 程式人生 > >作業系統核心空間和使用者空間的互訪問

作業系統核心空間和使用者空間的互訪問

前面寫了很多的文章來說明了這個問題,並且在文章中均舉了一些例子,如果為了解決具體問題,那麼那些就已經足夠了,但是如果想實現一個作業系統,這些就遠遠不夠了。

硬體是軟體的底層,這是一個前提,硬體是舞臺,軟體都是舞者,作業系統是應用程式的底層,作業系統是舞臺,應用程式是舞者,並且,硬體是操作的系統的舞臺,這裡作業系統成了舞者,這就是計算機的層次(對於有作業系統的計算機而言,不包括裸機)。在作業系統理論中,往往將程序的地址空間分為核心空間和使用者空間,這樣的話就實現了作業系統最起碼的安全性。但是存在一個疑問,核心空間的保護不是cpu硬體提供的嗎?比如Intel的x86處理器的特權環的概念,怎麼會是OS的概念呢?注意,cpu只是提供了一個機制而已,比如特權環的機制使得核心地址空間的保護變得更加容易和可靠,就像Intel的x86處理器那樣,你完全可以不用那一套,自己實現一套核心和使用者分離的機制,正如很多虛擬機器所做的那樣。

一般情況下在linux中,3G是個分界線,在windows中,2G是個分界線,當然可以改,作業系統的作者完全可以只給核心1k空間或者別的。作業系統提出了核心和使用者分離的策略,然後利用處理器來實現,仍以Intel處理器為例,利用它的分段和分頁機制來實現就可以了,很簡單,就是一個層次問題,正如前文所述,你也可以不用這些機制實現,而自己用純軟體的方式實現或者對於不需要安全控制的系統乾脆不實現。

理解了以上以後就比較好理解核心空間和使用者空間的互訪問問題了,首先要注意的是,它們的地位是不平等的,如果使用者空間訪問核心空間,那麼必須從那幾道所謂的門通過然後才會得到訪問權,比如系統呼叫,對於cpu硬體實現的空間分離,那麼硬體會自然而然的阻止使用者直接訪問核心

,對於純軟體實現的空間分離,那麼必須阻止使用者直接訪問核心,這是必須需要實現的;但是反過來,核心空間訪問使用者空間的情況就不是那麼自然了,都知道核心擁有最高特權級,cpu硬體就是通過給與核心最高特權級不公平的對待使用者空間的,這麼說來,內 核可以隨意訪問使用者空間,事實上真的是這樣,前面所謂的阻止就是硬體或者軟體在探知使用者訪問核心的時候會由於許可權不夠而觸發一個異常(中斷,陷阱),對於硬體比較簡單,cpu內部實現了這樣的機制,而對於軟體實現的空間分離就很麻煩了,這個不談,總之一定有辦法。但是核心訪問使用者空間就不會觸發異常或者陷阱,因為硬體給了核心以最高許可權,核心在做事的時候沒有必要通知別人,直接做就是了,因此硬體是不會阻止核心訪問任何地方的,可是事實上這樣會引起不必要的麻煩和混亂,因為使用者空間是程序間分離的,也就是說每個程序都 有一個獨立的使用者空間,並且程序具有很大的不確定性,比如哪個剛開始,哪個結束了,哪個異常了,那麼試問核心訪問使用者空間是訪問的誰的哪個程序的使用者空間,如此一來,要想不出錯的訪問使用者空間,核心就必須時刻跟蹤所有的使用者程序的執行情況,這會給核心帶來很大的負擔,反之核心空間就沒有那麼多事,就是一個管理者,就管理那麼幾件確定的事情,像什麼記憶體啦,程序啦等等,因此核心空間沒有必要做程序分離,只要一個就可以了,於是像linux這樣的系統就做了一個約定,
不允許沒有使用者空間上下文的核心執行緒訪問使用者空間,這樣的 話,只有軟體和程式設計師才能阻止核心訪問使用者空間,這個訪問許可權在硬體和作業系統本身那裡是全權開放的,權力掌握在編寫核心執行緒的程式設計師手中。

不允許核心訪問使用者空間使核心免去了很多的負擔,使核心設計更加簡化,使核心空間和使用者空間變得更加隔離從而使二者的地位平等了一點點。注意這裡並不是說就不允許核心訪問使用者空間,硬體都不吱聲,作業系統亂做啥限制啊,其實核心訪問使用者空間有一個前提,這個前提純粹是作業系統約定的,不同的作業系統可能不同,在linux上,該前提就是訪問使用者空間前必須得到該使用者空間上下文,也就是說核心必須知道訪問的是哪個程序的使用者空間,雖然核心可以帶著最高指示做任何事情,但是也不能胡作非為,做事之前必須明白自己做的事是什麼,這個約定對於我們人也很適用,權力機關是不能胡作非為的,但是...