操作系統(tǒng)的體系結(jié)構(gòu)
計(jì)算機(jī)組成部分包括用戶空間,linux內(nèi)核(內(nèi)核空間), 硬件部分, 用戶空間通過(guò) system call(系統(tǒng)調(diào)用) 與linux kernal通信.當(dāng)有system call調(diào)用時(shí),即發(fā)生用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換.
概念
OS(操作系統(tǒng))的資源是有限的,為了減少有限資源的訪問(wèn)和使用沖突,Linux對(duì)不同的操作賦予不同的執(zhí)行等級(jí).?
用戶態(tài): 3級(jí),只能受限的訪問(wèn)內(nèi)存辨绊,且不允許訪問(wèn)外圍設(shè)備够庙,占用cpu的能力被剝奪安疗,cpu資源可以被其他程序獲取。
內(nèi)核態(tài):0級(jí),cpu可以訪問(wèn)內(nèi)存的所有數(shù)據(jù)遣钳,包括外圍設(shè)備,例如硬盤麦乞,網(wǎng)卡蕴茴,cpu也可以將自己從一個(gè)程序切換到另一個(gè)程序。
內(nèi)核態(tài)與用戶態(tài)切換
所有的用戶程序都運(yùn)行在用戶態(tài),但是一些操作需要內(nèi)核態(tài)來(lái)完成.例如從硬盤讀取數(shù)據(jù),從鍵盤獲取輸入等,這些都需要OS(操作系統(tǒng))執(zhí)行.
工作流程:
1. 用戶態(tài)程序一些數(shù)據(jù)值放在寄存器中,或者使用參數(shù)創(chuàng)建一個(gè)Stack Frame(棧幀), 以表明需要OS(操作系統(tǒng))提供的服務(wù)
2. 用戶態(tài)執(zhí)行system call(系統(tǒng)調(diào)用)
3. CPU切換到內(nèi)核態(tài),并跳到位于內(nèi)存位置的指令,這些指令是操作系統(tǒng)的一部分,他們具有內(nèi)存保護(hù),不可被用戶態(tài)程序訪問(wèn)等特性
4. 這些指令被稱為trap(陷阱)或者system call handler(系統(tǒng)調(diào)用處理器). 他們會(huì)讀取程序放入內(nèi)存的數(shù)據(jù)值參數(shù),并執(zhí)行程序請(qǐng)求的服務(wù).
5.system call調(diào)用執(zhí)行完畢后,OS會(huì)重置CPU為用戶態(tài)并返回調(diào)用結(jié)果.
三種切換方式:
1. 系統(tǒng)調(diào)用姐直,這個(gè)上面已經(jīng)講解過(guò)了倦淀,在我公眾號(hào)之前的文章也有講解過(guò)。其實(shí)系統(tǒng)調(diào)用本身就是中斷声畏,但是軟件中斷撞叽,跟硬中斷不同。
2. 異常:如果當(dāng)前進(jìn)程運(yùn)行在用戶態(tài)插龄,如果這個(gè)時(shí)候發(fā)生了異常事件愿棋,就會(huì)觸發(fā)切換。例如:缺頁(yè)異常均牢。
3. 外設(shè)中斷:當(dāng)外設(shè)完成用戶的請(qǐng)求時(shí)糠雨,會(huì)向CPU發(fā)送中斷信號(hào)。
對(duì)于JAVA語(yǔ)言:
str =?"my string"http:// 用戶空間
x = x +?2
file.write(str)?// 切換到內(nèi)核空間
y = x +?4// 切換回用戶空間
文件的操作需要OS來(lái)完成, 當(dāng)有文件的讀寫操作時(shí), 會(huì)從用戶態(tài)切換到內(nèi)核態(tài). 其他操作如open?徘跪、read甘邀、write?砂竖、close、fsync?這些系統(tǒng)調(diào)用等
在linux中,用戶態(tài)和內(nèi)核態(tài)的分層如圖: