寄存器是CPU內部重要的組成部分,寄存器內部由N個觸發(fā)器組成,每個觸發(fā)器可以保存1位二進制數(shù),所以16位寄存器可以保存16個bit。
CPU內部一般有不同類型的多個寄存器,我們需要使用CPU對應的機器指令來操作這些寄存器,當然像內存、磁盤這些也是通過機器指令來操作的。
而CPU為了安全性,比如x86的CPU將機器指令分為了一般指令和特權指令,比如操作磁盤的指令就是特權指令,只有CPU處于某種特殊狀態(tài)下才能執(zhí)行特權指令。
x86 CPU利用內部一個特殊寄存器,用來標記此時的CPU能不能執(zhí)行特權指令,這個特殊寄存器中可以存四種狀態(tài),ring0、ring1、ring2、ring3。
Windows、Linux操作系統(tǒng)中只用了ring0和ring3兩種狀態(tài),如果處于ring0,表示CPU可以執(zhí)行所有指令,包括特權指令,如果處于ring3,表示CPU不能執(zhí)行特權指令,ring0等級高,ring3等級低。
不管是操作系統(tǒng)還是運行在操作系統(tǒng)之上的軟件,都是用高級語言開發(fā)出來的,最終都需要翻譯為機器指令。
所以本質上來說,我們自己用c或java開發(fā)的軟件,只要翻譯成了機器指令,也是可以直接操作寄存器的,操作磁盤的。
但是我們不會這么來做,也肯定不需要每個軟件自己去實現(xiàn)這么底層并通用的功能,所以我們通常會調用操作系統(tǒng)的函數(shù)來操作磁盤。
操作系統(tǒng)就相當于一個中間層。
同時操作系統(tǒng)為了保護系統(tǒng),就設計了內核態(tài)和用戶態(tài)。
當我們電腦啟動時,CPU處于ring0狀態(tài),這時所有指令都可以執(zhí)行,從而啟動引導程序,從而啟動操作系統(tǒng),操作系統(tǒng)在啟動時,會對內存就行劃分,劃出一部分內存只能被操作系統(tǒng)自己使用,其他內存可以給應用軟件使用。
操作系統(tǒng)啟動完了之后,CPU狀態(tài)就改為ring3,開始運行應用軟件。
由于此時cpu處于ring3,所以應用軟件想要運行一些特殊指令肯定是不行的。
當我們調用操作系統(tǒng)的提供的函數(shù)時,操作系統(tǒng)會來執(zhí)行特權指令,可是操作系統(tǒng)不也是c語言寫的代碼嗎,要執(zhí)行特權指令需要ring0,如何把ring3切換成ring0呢?
系統(tǒng)中斷,其實就是一條指令,比如int 0x80。
系統(tǒng)中斷,cpu會自動切回到ring0狀態(tài),然后執(zhí)行操作系統(tǒng)在系統(tǒng)啟動時所設置好的代碼,而這段代碼可以根據(jù)中斷之前所執(zhí)行的代碼來繼續(xù)執(zhí)行后續(xù)邏輯,并且此時cpu已經處于在ring0狀態(tài)了,可以正常執(zhí)行了。
而CPU處于ring0狀態(tài)就是我們說的內核態(tài),處于ring3狀態(tài)就是我們說的用戶態(tài)。
總結,當我們自己寫的程序要操作磁盤時,因為要執(zhí)行特權指令,但是CPU處于ring3,無法直接執(zhí)行特殊指令,需要調用操作系統(tǒng)函數(shù),從而會修改CPU處于ring0,從而進去內核態(tài)。
用戶態(tài)時,CPU只能執(zhí)行一些普通指令,內核態(tài)時,CPU能執(zhí)行所有指令。
今天就聊到這,拋磚引玉,如果有不對的地方,歡迎大佬們指出。
-
寄存器
+關注
關注
31文章
5363瀏覽量
121158 -
cpu
+關注
關注
68文章
10902瀏覽量
213002 -
Linux
+關注
關注
87文章
11345瀏覽量
210389 -
WINDOWS
+關注
關注
4文章
3569瀏覽量
89301 -
觸發(fā)器
+關注
關注
14文章
2003瀏覽量
61347
發(fā)布評論請先 登錄
相關推薦
為什么gv7601在spi用戶態(tài)訪問寄存器時,讀取音頻寄存器讀不到信息,是要設置什么嗎?
操作系統(tǒng)為什么分內核態(tài)和用戶態(tài)?這兩者如何切換?
請問CPU與寄存器,內核態(tài)與用戶態(tài)及如何切換?
74HC595D_3態(tài)8位移位寄存器
Linux內核用戶態(tài)是如何睡眠的
20 位寄存器驅動器,帶反向寄存器使能;三態(tài)-74ALVC16836A
![20 位<b class='flag-5'>寄存器</b>驅動<b class='flag-5'>器</b>,帶反向<b class='flag-5'>寄存器</b>使能;三<b class='flag-5'>態(tài)</b>-74ALVC16836A](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
16位總線收發(fā)器/寄存器;三態(tài)-74ALVCH16646
![16位總線收發(fā)<b class='flag-5'>器</b>/<b class='flag-5'>寄存器</b>;三<b class='flag-5'>態(tài)</b>-74ALVCH16646](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
18 位寄存器驅動器,帶反向寄存器使能;三態(tài)-74ALVC16834A
![18 位<b class='flag-5'>寄存器</b>驅動<b class='flag-5'>器</b>,帶反向<b class='flag-5'>寄存器</b>使能;三<b class='flag-5'>態(tài)</b>-74ALVC16834A](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
具有三態(tài)輸出寄存器的 SNx4HC595 8位移位寄存器數(shù)據(jù)表
![具有三<b class='flag-5'>態(tài)</b>輸出<b class='flag-5'>寄存器</b>的 SNx4HC595 8位移位<b class='flag-5'>寄存器</b>數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
具有三態(tài)輸出寄存器的汽車類 8位移位寄存器SN74AHC165-Q1數(shù)據(jù)表
![具有三<b class='flag-5'>態(tài)</b>輸出<b class='flag-5'>寄存器</b>的汽車類 8位移位<b class='flag-5'>寄存器</b>SN74AHC165-Q1數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
八路總線收發(fā)器/寄存器3態(tài) 數(shù)據(jù)表
![八路總線收發(fā)<b class='flag-5'>器</b>/<b class='flag-5'>寄存器</b>3<b class='flag-5'>態(tài)</b> 數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
具有3態(tài)輸出的多級流水線寄存器數(shù)據(jù)表
![具有3<b class='flag-5'>態(tài)</b>輸出的多級流水線<b class='flag-5'>寄存器</b>數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
帶3態(tài)輸出的16位收發(fā)器和寄存器數(shù)據(jù)表
![帶3<b class='flag-5'>態(tài)</b>輸出的16位收發(fā)<b class='flag-5'>器</b>和<b class='flag-5'>寄存器</b>數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
帶3態(tài)輸出的16位總線收發(fā)器和寄存器數(shù)據(jù)表
![帶3<b class='flag-5'>態(tài)</b>輸出的16位總線收發(fā)<b class='flag-5'>器</b>和<b class='flag-5'>寄存器</b>數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論