之所以出現這個定義是因為系統要安全:內核要和用戶程序分開..內核一定要安全.不能被用戶程序干涉.
但是有時候用戶程序也需要讀取內核的某些數據,怎么辦呢?
于是os將內核程序開辟一些可以供用用戶程序訪問的段.但是不允許用戶程序寫入數據.
1.內核不用知道用戶程序的數據.內核不用調用用戶程序的數據.內核不用轉移到用戶程序中來.
2.用戶程序只能訪問到內核的某些共享的段.我們稱這些段為一致代碼段
3.用戶程序不能訪問內核不共享的段.
1.在x86中的數據和代碼是按段來存放的:[section]
2.............程序是通過選擇子/門調用等等來在段之間來回走動的.
3.每一個選擇子/門調用選擇子是有分等級的:這個是在選擇符的結構中:RPL(最后2位)
5:每一個代碼段/數據段也是有分等級的.:這個是在gdt描述符中.
6:調用的選擇符和被調用的段都分了等級.哪么這些等級在哪里使用呢?在一致代碼段.也就是共享段中使用
既然是共享所以就有規則了:
對于一致代碼段:也就是共享的段.
1.特權級高的程序不允許訪問特權級低的數據:核心態不允許調用用戶態的數據.
2.特權級低的程序可以訪問到特權級高的數據.但是特權級不會改變:用戶態還是用戶態.
對于普通代碼段.也就是非一致代碼段:
0.只允許同級間訪問.
1.絕對禁止不同級訪問:核心態不用用戶態.用戶態也不使用核心態.
總結:似乎這些東西跟我們初學者預想的那樣不同.核心態是老大.想用訪問誰都可以.其實錯了.結果恰恰相反.
這是因為防止用戶篡改核心態的數據.導致核心態執行用戶代碼.而造成內核崩潰.
內核壞了.什么事都可能發生.