Hardware Features for OS
- 安全性(用戶態(tài)和內(nèi)核態(tài))
- 對指令的保護(hù)
- 對內(nèi)存的保護(hù)
- 錯(cuò)誤
- 系統(tǒng)調(diào)用
- 中斷(時(shí)鐘中斷,I/O中斷,等等)
- 同步
操作系統(tǒng)是事件驅(qū)動(dòng)的(event-driven)
OS Control Flow
操作系統(tǒng)啟動(dòng)之后,所有只有通過event才能進(jìn)入內(nèi)核態(tài)
- event直接停止當(dāng)前在執(zhí)行的操作
- 將系統(tǒng)的狀態(tài)切換到內(nèi)核態(tài),然后調(diào)用與event相關(guān)的處理函數(shù)
內(nèi)核對每一種事件類型準(zhǔn)備了處理函數(shù)
當(dāng)處理器遇到一種給定的事件類型,會(huì)
- 先將控制權(quán)轉(zhuǎn)移給OS里面的處理函數(shù)
- 處理函數(shù)先保存程序的運(yùn)行狀態(tài)(PC,寄存器,等等)
- 處理函數(shù)的具體功能被調(diào)用
- 處理函數(shù)恢復(fù)系統(tǒng)狀態(tài),返回原來的程序
Events
分類
- 中斷 (由外部事件引起的,unexpected)(異步的)
- 異常(由正在執(zhí)行的指令引起的,CPU解決一個(gè)fault或者trap需要軟件的介入,deliberate)(同步的)
- 缺頁
- 除零
相應(yīng)的處理函數(shù)
- 對用戶態(tài)的fault
當(dāng)用戶進(jìn)程出現(xiàn)不可恢復(fù)的錯(cuò)誤的時(shí)候,操作系統(tǒng)通過殺死當(dāng)前線程來解決
- 如沒有相應(yīng)的Handler時(shí)
- 先halt這個(gè)進(jìn)程,然后將進(jìn)程的狀態(tài)寫到文件中,接著殺死這個(gè)進(jìn)程
- 在Unix中,這個(gè)是很多信號(hào)的默認(rèn)的處理函數(shù)
- 對系統(tǒng)態(tài)的fault
- 遇到的類型可能是:對NULL的訪問,除零,沒有定義的指令
- 這些是致命的使系統(tǒng)崩潰的錯(cuò)誤。
- Windows會(huì)出現(xiàn)藍(lán)屏(內(nèi)核halt,狀態(tài)寫入core file,機(jī)器被鎖住)
- 更進(jìn)一步的fault的解決
- 有一些錯(cuò)誤可以修復(fù)(比如缺頁),這種時(shí)候我們會(huì)返回導(dǎo)致錯(cuò)誤的上下文
- 有一些錯(cuò)誤可以通知進(jìn)程
- 內(nèi)核態(tài)的處理函數(shù)會(huì)修改PC的值,使得從處理函數(shù)返回時(shí),會(huì)跳轉(zhuǎn)到用戶程序自己寫的處理函數(shù)
- 用戶的處理函數(shù)也是要登記的
- 可以使用signal和APC實(shí)現(xiàn)
系統(tǒng)調(diào)用
只有操作系統(tǒng)可以直接使用物理設(shè)備,那用戶態(tài)的程序該如何使用呢?
—— OS需要提供給用戶程序有限的、使用硬件設(shè)備的間接的接口。
當(dāng)一個(gè)用戶程序想做一些超出自己權(quán)限的事情的時(shí)候,必須通過系統(tǒng)調(diào)用。
系統(tǒng)調(diào)用的過程是這樣:
- 傳遞一個(gè)參數(shù),表示自己要調(diào)用什么
- 保存調(diào)用者的狀態(tài),從而能返回
- 引起一個(gè)異常
- 從系統(tǒng)調(diào)用回來,恢復(fù)用戶程序的狀態(tài)
這樣的流程需要:
- 確定輸入的參數(shù)(放在buffer固定的位置)
- 恢復(fù)保存的狀態(tài),恢復(fù)到用戶態(tài),重新開始執(zhí)行
系統(tǒng)調(diào)用的函數(shù)
- 與進(jìn)程控制有關(guān)的:
- create process, allocate memory
- 文件管理
- create, read, delete file
- 設(shè)備管理
- open device, read/write device, mount device
- 信息維護(hù)
- get time, get system data/parameters
- 交互
- create/delete channel, send/receive message
程序員一般是不會(huì)直接寫系統(tǒng)調(diào)用的,而是使用一些庫函數(shù)(如C,java的庫)。
—— 因?yàn)橄到y(tǒng)調(diào)用的具體實(shí)現(xiàn)與硬件的架構(gòu)相關(guān),而使用這些庫函數(shù)的時(shí)候程序員就不需要知道在具體的架構(gòu)上的系統(tǒng)調(diào)用的指令是什么了。只需要直接使用這個(gè)同一的接口。
系統(tǒng)調(diào)用與函數(shù)調(diào)用的區(qū)別
系統(tǒng)調(diào)用是通過int 80H的指令進(jìn)行陷入的,而函數(shù)調(diào)用則是直接call即可。系統(tǒng)調(diào)用會(huì)發(fā)生上下文切換,函數(shù)調(diào)用則不會(huì)、
中斷
中斷是異步的,有
- 來自I/O等設(shè)備的硬件中斷
- 軟件和硬件的計(jì)時(shí)器
兩種風(fēng)格的中斷:
- 明確的:只會(huì)在一條指令執(zhí)行之后發(fā)生(更受OS設(shè)計(jì)者喜歡,因?yàn)檫@樣他們編程的不確定性就少很多?)
- 不明確的:可以在指令執(zhí)行的期間發(fā)生。(CPU設(shè)計(jì)者喜歡,因?yàn)檫@樣中斷設(shè)計(jì)更及時(shí)?)
Timer & I/O
timer對操作系統(tǒng)而言很重要,每個(gè)一段時(shí)間發(fā)送一個(gè)中斷,timer中斷的處理函數(shù)在內(nèi)核態(tài)。
I/O是硬件和進(jìn)程間的同步。設(shè)備與機(jī)器獨(dú)立運(yùn)行,在完成任務(wù)時(shí),發(fā)送中斷給CPU,OS的處理函數(shù)來處理這個(gè)中斷。
Interrupt Questions
中斷中止了程序繼續(xù)運(yùn)行,并將控制權(quán)交給了操作系統(tǒng)。
那么操作系統(tǒng)可以被打斷么?還有什么方法可以代替中斷,這些方法又有什么劣勢?