(轉載)一致代碼段和非一致代碼段

 轉自:http://hi.baidu.com/walkingman520/blog/item/4463e21133a42513b9127b91.html

之所以出現這個定義是因爲系統要安全:內核要和用戶程序分開.內核一定要安全.不能被用戶程序干涉.
但是有時候用戶程序也需要讀取內核的某些數據,怎麼辦呢?

於是os將內核程序開闢一些可以供用用戶程序訪問的段.但是不允許用戶程序寫入數據.
1.內核不用知道用戶程序的數據.內核不用調用用戶程序的數據.內核不用轉移到用戶程序中來.
2.用戶程序只能訪問到內核的某些共享的段.我們稱這些段爲一致代碼段
3.用戶程序不能訪問內核不共享的段.

1.在x86中的數據和代碼是按段來存放的:[section]
2.程序是通過選擇子/門調用等等來在段之間來回走動的.
3.每一個選擇子/門調用選擇子是有分等級的:這個是在選擇符的結構中:RPL(最後2位)
4.每一個代碼段/數據段也是有分等級的.:這個是在gdt描述符中.

調用的選擇符和被調用的段都分了等級.哪麼這些等級在哪裏使用呢?
在一致代碼段.也就是共享段中使用

既然是共享所以就有規則了:

對於一致代碼段:也就是共享的段.
1.特權級高的程序不允許訪問特權級低的數據:核心態不允許調用用戶態的數據.
2.特權級低的程序可以訪問到特權級高的數據.但是特權級不會改變:用戶態還是用戶態.

對於普通代碼段.也就是非一致代碼段:
0.只允許同級間訪問.
1.絕對禁止不同級訪問:核心態不用用戶態.用戶態也不使用核心態.

總結:似乎這些東西跟我們初學者預想的那樣不同.核心態是老大.想用訪問誰都可以.其實錯了.結果恰恰相反.
這是因爲防止用戶篡改核心態的數據.導致核心態執行用戶代碼.而造成內核崩潰.內核壞了.什麼事都可能發生.

notes:要注意特權級和特權級數的問題.
            特權級數                     特權級
                 0            系統級:特權級高 特權級數低
                 3            用戶級:特權級低 特權級數高

前些日子瀏覽外文的時候.正巧看到ring0,ring3突然想到另一種方式記憶這個了:就像北京的路一樣.環0環1環2環3.越是裏面離內核越近.0就是內核紫荊城.3就是外環.暈死.english已經那麼明確了.早想到這個就好了.不用死記硬背了
發佈了15 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章