2012-11-01 40 views
11

我剛剛從Silberschatz,p。的「操作系統概念」中讀到這一點。 18:模式位在哪裏?

的位,稱爲模式位,被添加到計算機 的硬件,以指示當前模式:內核(0)或用戶(1)。通過模式位 ,我們可以區分以代表 的操作系統執行的任務和代表 用戶執行的任務。

模式位在哪裏存儲?

(難道是CPU的寄存器?你能讀懂的模式位?據我的理解,CPU必須能夠讀取模式位。它是如何知道哪些程序獲取模式位0 ?使用特殊地址的程序獲得模式位0?誰設置模式位/它是如何設置的?)

+1

操作系統設置它時,它的上下文切換 –

回答

5

這是一個CPU寄存器。只有在內核模式下才可以訪問。

它如何設置的細節取決於CPU設計。在大多數常用硬件中,當執行用於執行系統調用的特殊操作碼時,它會自動設置。然而,還有其他體系結構,其中某些內存頁面可能有一個標誌集,表明它們是內核的「網關」 - 調用這些頁面上的函數設置內核模式位。

3

現在它被賦予了其他名稱,如管理員模式或保護ring

13

請注意,您的問題很大程度上取決於CPU itselt;雖然這種情況並不常見,但您可能會遇到某些用戶級別/內核級別甚至不存在的處理器。

CS寄存器具有另一個重要功能:它包括一個2比特字段 指定CPU的當前特許級(CPL)。 值0表示最高特權級別,而值3表示 最低特權級別。 Linux僅使用0和3級別,分別稱爲內核模式和用戶模式,分別爲 。

(從「瞭解Linux內核3E」採取第2.2.1節)
另外請注意,這取決於CPU,你可以清楚地看到,它會從一個更改爲另一個但這個概念,一般來說,持有。


誰設置的?通常,內核/ CPU和用戶進程不能改變它,但讓我在這裏解釋一下。

這是一個過於簡單化,不要把它當作是
讓我們假設在加載內核和第一應用纔剛剛起步(第一殼),內核加載家居這個應用程序啓動,將該位設置在cs寄存器中(如果您正在運行x86),然後跳轉到Shell進程的代碼。

外殼將繼續執行其所有指令在這種情況下,如果過程中包含了一些特權指令,CPU將取它並不會執行它;它會給出一個異常(硬件異常),告訴內核有人嘗試執行特權指令,此處內核代碼處理作業(CPU將cs設置爲內核模式並跳轉到某個已知位置來處理這種類型的錯誤。?(也許終止進程,也許別的東西)

因此,如何能的過程做一些特權談起例如某個設備 這裏談到的系統調用,內核會爲你做這項工作

什麼情況如下:
您可以設置要在某一個地方有什麼(比如你設定要訪問一個文件,該文件的位置是X,你正在訪問閱讀等)的一些寄存器(TH e內核文檔會讓你知道這個),然後(在x86上)你會調用int0x80指令。

此中斷CPU,停止你的工作,設置模式到內核模式,跳IP寄存器具有不同於現用作文件IO請求和移動代碼中的一些已知位置。一旦你的數據準備好了,內核就會將這些數據設置在一個你可以訪問的地方(內存位置,寄存器;它取決於CPU /內核/你所要求的),將cs標誌設置爲用戶模式並跳轉回到你的指令旁邊的int 0x80指令。

最後,出現這種情況,只要一個開關發生,內核得到通知,發生了一件事情,所以CPU終止當前指令,改變CPU的狀態,並跳轉到哪裏,處理這件事情的代碼;上面解釋的過程粗略地說,適用於如何在內核模式和用戶模式之間切換。

+0

既然你說,這是一個過於簡單化,可能您重定向我的一些教程,書籍或材料不懂的題目更深入?謝謝! –

+2

@SamBruns:一本書,我強烈建議:「計算機系統:程序員的角度來看」,我建議你檢查這個問題,以及更多的操作系統信息(更深度): HTTP://wiki.osdev。 org/Main_Page。 – Fingolfin