寄存器是CPU內(nèi)部重要的組成部分,寄存器內(nèi)部由N個(gè)觸發(fā)器組成,每個(gè)觸發(fā)器可以保存1位二進(jìn)制數(shù),所以16位寄存器可以保存16個(gè)bit。
CPU內(nèi)部一般有不同類型的多個(gè)寄存器,我們需要使用CPU對(duì)應(yīng)的機(jī)器指令來操作這些寄存器,當(dāng)然像內(nèi)存、磁盤這些也是通過機(jī)器指令來操作的。
而CPU為了安全性,比如x86的CPU將機(jī)器指令分為了一般指令和特權(quán)指令,比如操作磁盤的指令就是特權(quán)指令,只有CPU處于某種特殊狀態(tài)下才能執(zhí)行特權(quán)指令。
x86 CPU利用內(nèi)部一個(gè)特殊寄存器,用來標(biāo)記此時(shí)的CPU能不能執(zhí)行特權(quán)指令,這個(gè)特殊寄存器中可以存四種狀態(tài),ring0、ring1、ring2、ring3。
Windows、Linux操作系統(tǒng)中只用了ring0和ring3兩種狀態(tài),如果處于ring0,表示CPU可以執(zhí)行所有指令,包括特權(quán)指令,如果處于ring3,表示CPU不能執(zhí)行特權(quán)指令,ring0等級(jí)高,ring3等級(jí)低。
不管是操作系統(tǒng)還是運(yùn)行在操作系統(tǒng)之上的軟件,都是用高級(jí)語言開發(fā)出來的,最終都需要翻譯為機(jī)器指令。
所以本質(zhì)上來說,我們自己用c或java開發(fā)的軟件,只要翻譯成了機(jī)器指令,也是可以直接操作寄存器的,操作磁盤的。
但是我們不會(huì)這么來做,也肯定不需要每個(gè)軟件自己去實(shí)現(xiàn)這么底層并通用的功能,所以我們通常會(huì)調(diào)用操作系統(tǒng)的函數(shù)來操作磁盤。
操作系統(tǒng)就相當(dāng)于一個(gè)中間層。
同時(shí)操作系統(tǒng)為了保護(hù)系統(tǒng),就設(shè)計(jì)了內(nèi)核態(tài)和用戶態(tài)。
當(dāng)我們電腦啟動(dòng)時(shí),CPU處于ring0狀態(tài),這時(shí)所有指令都可以執(zhí)行,從而啟動(dòng)引導(dǎo)程序,從而啟動(dòng)操作系統(tǒng),操作系統(tǒng)在啟動(dòng)時(shí),會(huì)對(duì)內(nèi)存就行劃分,劃出一部分內(nèi)存只能被操作系統(tǒng)自己使用,其他內(nèi)存可以給應(yīng)用軟件使用。
操作系統(tǒng)啟動(dòng)完了之后,CPU狀態(tài)就改為ring3,開始運(yùn)行應(yīng)用軟件。
由于此時(shí)cpu處于ring3,所以應(yīng)用軟件想要運(yùn)行一些特殊指令肯定是不行的。
當(dāng)我們調(diào)用操作系統(tǒng)的提供的函數(shù)時(shí),操作系統(tǒng)會(huì)來執(zhí)行特權(quán)指令,可是操作系統(tǒng)不也是c語言寫的代碼嗎,要執(zhí)行特權(quán)指令需要ring0,如何把ring3切換成ring0呢?
系統(tǒng)中斷,其實(shí)就是一條指令,比如int 0x80。
系統(tǒng)中斷,cpu會(huì)自動(dòng)切回到ring0狀態(tài),然后執(zhí)行操作系統(tǒng)在系統(tǒng)啟動(dòng)時(shí)所設(shè)置好的代碼,而這段代碼可以根據(jù)中斷之前所執(zhí)行的代碼來繼續(xù)執(zhí)行后續(xù)邏輯,并且此時(shí)cpu已經(jīng)處于在ring0狀態(tài)了,可以正常執(zhí)行了。
而CPU處于ring0狀態(tài)就是我們說的內(nèi)核態(tài),處于ring3狀態(tài)就是我們說的用戶態(tài)。
總結(jié),當(dāng)我們自己寫的程序要操作磁盤時(shí),因?yàn)橐獔?zhí)行特權(quán)指令,但是CPU處于ring3,無法直接執(zhí)行特殊指令,需要調(diào)用操作系統(tǒng)函數(shù),從而會(huì)修改CPU處于ring0,從而進(jìn)去內(nèi)核態(tài)。
用戶態(tài)時(shí),CPU只能執(zhí)行一些普通指令,內(nèi)核態(tài)時(shí),CPU能執(zhí)行所有指令。
今天就聊到這,拋磚引玉,如果有不對(duì)的地方,歡迎大佬們指出。
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120428 -
cpu
+關(guān)注
關(guān)注
68文章
10870瀏覽量
211878 -
Linux
+關(guān)注
關(guān)注
87文章
11310瀏覽量
209599 -
WINDOWS
+關(guān)注
關(guān)注
4文章
3547瀏覽量
88754 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2000瀏覽量
61165
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論