3.2 操作系統(tǒng)如何進(jìn)行權(quán)限限制 前言中斷是指計(jì)算機(jī)運(yùn)行過(guò)程中,出現(xiàn)某些意外情況需主機(jī)干預(yù)時(shí),機(jī)器能自動(dòng)停止正在運(yùn)行的程序并轉(zhuǎn)入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續(xù)運(yùn)行。 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 一、中斷簡(jiǎn)介執(zhí)行完當(dāng)前指令后,檢測(cè)到從CPU內(nèi)部或者外部發(fā)送過(guò)來(lái)的中斷信息,并且可以立即對(duì)所接受到的信息進(jìn)行處理; 1.1 中斷信息中斷信息根據(jù)來(lái)自CPU內(nèi)部和外部分為:內(nèi)中斷和外中斷 1.2 異常(內(nèi)中斷)(1)終止:斷電等 (2)故障:缺頁(yè)、除法錯(cuò)誤、溢出等 (3)自陷:調(diào)用int指令引發(fā)中斷 例:BIOS中以中斷處理程序的形式提供了微機(jī)中基本I/O設(shè)備的控制程序,稱(chēng)為'BIOS中斷',應(yīng)用程序可以用'INT n'指令調(diào)用這些程序。 1.3 外中斷外部中斷是實(shí)時(shí)地處理外部事件的一種內(nèi)部機(jī)制。當(dāng)某種外部事件發(fā)生時(shí),中斷系統(tǒng)將迫使CPU暫停正在執(zhí)行的程序,轉(zhuǎn)而去進(jìn)行中斷事件的處理;中斷處理完畢后.又返回被中斷的程序處,繼續(xù)執(zhí)行下去。 例:鼠標(biāo)、鍵盤(pán)引起的中斷; 二、中斷服務(wù)程序通過(guò)執(zhí)行事先編好的某個(gè)特定程序,用來(lái)處理中斷信息的程序。 2.1 BIOS中斷BIOS中,以中斷處理程序的形式提供了計(jì)算機(jī)中基本I/O設(shè)備的控制程序,稱(chēng)為'BIOS中斷',應(yīng)用程序可以用'INT n'指令調(diào)用這些程序。 例:'int 0x13h' BIOS提供給程序控制磁盤(pán)IO資源; 2.2 DOS中斷程序運(yùn)行的主要軟件環(huán)境是操作系統(tǒng)。 操作系統(tǒng)為程序運(yùn)行提供基本的服務(wù),如,程序的裝入、結(jié)束,內(nèi)存的分配,文件管理等。以DOS操作系統(tǒng)為例,它也以中斷處理程序的形式提供這些服務(wù),稱(chēng)為'DOS中斷', 應(yīng)用程序也用'INT n'指令調(diào)用這些服務(wù)。 也可稱(chēng)為:操作系統(tǒng)提供系統(tǒng)調(diào)用(接口)來(lái)供上層應(yīng)用來(lái)和操作系統(tǒng)交互,進(jìn)而控制系統(tǒng)資源。 例:如計(jì)算機(jī)應(yīng)用程序用 “ int 0x80h” 或者 “ int 0x21h”,通過(guò)操作系統(tǒng)提供的系統(tǒng)調(diào)用來(lái)操作計(jì)算機(jī)資源;
三、系統(tǒng)調(diào)用通過(guò)執(zhí)行事先編好的某個(gè)特定程序,用來(lái)處理中斷信息的程序。 3.1 操作系統(tǒng)為什么要提供系統(tǒng)調(diào)用?為防止用戶(hù)程序隨意對(duì)操作系統(tǒng)內(nèi)核區(qū)域的訪問(wèn)與操作,操作系統(tǒng)進(jìn)行權(quán)限控制; 3.2 操作系統(tǒng)如何進(jìn)行權(quán)限限制 操作系統(tǒng)將內(nèi)存區(qū)域分為了用戶(hù)態(tài)和內(nèi)核態(tài),由于CS:IP是當(dāng)前的指令,所以使用CS的最低兩位來(lái)表示: 0是內(nèi)核態(tài),3是用戶(hù)態(tài)。
3.3 如何訪問(wèn)內(nèi)核函數(shù)操作系統(tǒng)提供了中斷指令int 0x80(DOS系統(tǒng)調(diào)用)來(lái)主動(dòng)進(jìn)入內(nèi)核,這是用戶(hù)程序發(fā)起的調(diào)用訪問(wèn)內(nèi)核代碼的唯一方式;
調(diào)用系統(tǒng)函數(shù)時(shí)會(huì)通過(guò)內(nèi)聯(lián)匯編代碼插入int 0x80的中斷指令,(不僅會(huì)插入中斷指令,還會(huì)將系統(tǒng)調(diào)用編號(hào)設(shè)置給 %eax 寄存器) 核心:內(nèi)核接收到int 0x80中斷后,需要查詢(xún)IDT表來(lái)取出中斷處理函數(shù)地址,此處不同與其他操作系統(tǒng)區(qū)域的代碼,int 0x80的idt表中的DPL被設(shè)置成了3,所以能從用戶(hù)態(tài)能直接訪問(wèn)int 0x80的中斷指令的(唯一入口),然后將CPL修改為0(訪管指令),后續(xù)就可以正常訪問(wèn)內(nèi)核代碼。
注:這是一段在系統(tǒng)初始化階段執(zhí)行的代碼,主要工作是用來(lái)設(shè)置0x80的中斷處理IDT表項(xiàng),設(shè)置相應(yīng)的&system_call入口函數(shù)的地址。并且注意到這里面會(huì)將0x80的IDT表項(xiàng)的DPL設(shè)置為3,這樣CPL=3用戶(hù)態(tài)的程序就能進(jìn)入,跳入IDT表之后,段選擇符是8,將段和偏移設(shè)置為新的pc,cs=8,ip=&system_call,這個(gè)cs=8 還要再找gdt表,就是從內(nèi)核0位開(kāi)始,此時(shí)CPl已經(jīng)變成了0。也就完成了特權(quán)級(jí)的轉(zhuǎn)化。再下一步,在system_call中會(huì)根據(jù)%eax中跳轉(zhuǎn)到相應(yīng)的處理函數(shù)執(zhí)行,這樣就完成了一個(gè)系統(tǒng)函數(shù)的調(diào)用過(guò)程 四、系統(tǒng)調(diào)用流程Linux的系統(tǒng)調(diào)用通過(guò)int 80h實(shí)現(xiàn),用系統(tǒng)調(diào)用號(hào)來(lái)區(qū)分入口函數(shù)。 操作系統(tǒng)實(shí)現(xiàn)系統(tǒng)調(diào)用的基本過(guò)程是: 4.1 應(yīng)用程序調(diào)用庫(kù)函數(shù)(API);(1)應(yīng)用程序如何執(zhí)行? 通過(guò)執(zhí)行代碼序列,配合用戶(hù)棧完成函數(shù)調(diào)用和返回(調(diào)用函數(shù)時(shí)將PC地址壓棧,當(dāng)調(diào)用結(jié)束時(shí),通過(guò)彈棧實(shí)現(xiàn)返回),實(shí)現(xiàn)順序執(zhí)行和跳轉(zhuǎn); 注:代碼數(shù)據(jù)段、用戶(hù)棧 (2)系統(tǒng)函數(shù)在哪里?如何執(zhí)行? 由于保護(hù)系統(tǒng)函數(shù),通過(guò)權(quán)限集完成;導(dǎo)致用戶(hù)程序無(wú)法執(zhí)行系統(tǒng)函數(shù); 但是為了用戶(hù)程序能夠執(zhí)行操作系統(tǒng)提供的功能,OS將部分功能程序通過(guò)系統(tǒng)調(diào)用的形式交由用戶(hù)程序執(zhí)行;(syscall) 通過(guò)調(diào)用int指令,來(lái)執(zhí)行操作系統(tǒng)或者BIOS提供的函數(shù)處理;(中斷、異常、函數(shù)調(diào)用) 但是為了用戶(hù)程序方便使用,C語(yǔ)言等通過(guò)提供庫(kù)函數(shù),將系統(tǒng)調(diào)用函數(shù)所需要的的參數(shù)等封裝,提供給用戶(hù)程序更簡(jiǎn)單的函數(shù); (2) API將系統(tǒng)調(diào)用號(hào)存入EAX,然后通過(guò)中斷調(diào)用使系統(tǒng)進(jìn)入內(nèi)核態(tài); 4.2 庫(kù)函數(shù)(API);(1)通過(guò)封裝思想,提供給用戶(hù)程序更簡(jiǎn)單的函數(shù)調(diào)用 (2)內(nèi)部將使用函數(shù)調(diào)用,將系統(tǒng)調(diào)用需要的參數(shù)傳入; 比如:系統(tǒng)調(diào)用號(hào); 4.3 系統(tǒng)調(diào)用;首先,需要明白操作系統(tǒng)也是一個(gè)軟件,只是操作系統(tǒng)直接操作硬件資源,是一個(gè)系統(tǒng)軟件; 操作系統(tǒng)通過(guò)int指令,主動(dòng)進(jìn)行中斷處理;但是用戶(hù)態(tài)無(wú)法進(jìn)入操作系統(tǒng),所以操作系統(tǒng)提供 (3) 內(nèi)核中的中斷處理函數(shù)根據(jù)系統(tǒng)調(diào)用號(hào),調(diào)用對(duì)應(yīng)的內(nèi)核函數(shù)(系統(tǒng)調(diào)用); (4) 系統(tǒng)調(diào)用完成相應(yīng)功能,將返回值存入EAX,返回到中斷處理函數(shù); (5) 中斷處理函數(shù)返回到API中; (6) API將EAX返回給應(yīng)用程序。 五、中斷和異常的區(qū)別 系統(tǒng)調(diào)用5.1 中斷步驟1. 關(guān)中斷(關(guān)中斷在內(nèi)核態(tài)) 2. 保存斷點(diǎn)(將PC指針壓棧) 3. 中斷服務(wù)程序?qū)ぶ罚ǜ鶕?jù)中斷類(lèi)型號(hào)) 4. 保存現(xiàn)場(chǎng)環(huán)境(PSW和通用寄存器等) 置屏蔽字 5. 開(kāi)中斷 6. 中斷服務(wù) 7. 關(guān)中斷 8. 恢復(fù)現(xiàn)場(chǎng)環(huán)境(PSW和通用寄存器等) 恢復(fù)屏蔽字 9. 開(kāi)中斷 10. 中斷返回(將PC指針彈棧) (1-10 都在內(nèi)核態(tài)執(zhí)行) 5.2 異常步驟例1:系統(tǒng)調(diào)用 1. 調(diào)用庫(kù)函數(shù)(將PC指針壓棧(函數(shù)調(diào)用,不同于保存斷點(diǎn)),間接調(diào)用系統(tǒng)函數(shù),傳遞系統(tǒng)調(diào)用號(hào)) (1 為用戶(hù)態(tài)) --------------------------------------------------------------------------------------- 2. 通過(guò)Trap指令,用戶(hù)態(tài)進(jìn)入內(nèi)核 3. 保存斷點(diǎn)(將用戶(hù)棧指針、段基址寄存器和偏移地址 壓入內(nèi)核棧) 4. 系統(tǒng)調(diào)用程序?qū)ぶ罚ǜ鶕?jù)系統(tǒng)調(diào)用號(hào)) 5. 保存現(xiàn)場(chǎng)環(huán)境 (將PSW、通用寄存器等依次壓棧 ---- 用什么壓什么) 6. 系統(tǒng)服務(wù) 7. 恢復(fù)現(xiàn)場(chǎng)環(huán)境(通用寄存器、PSW等依次退棧) 8. 中斷返回(將段基址寄存器和偏移地址、用戶(hù)棧指針依次退棧) (2-8 為核心態(tài)) 5.3 中斷和異常的區(qū)別5.3.1 運(yùn)行時(shí)態(tài)不一樣中斷是被動(dòng)運(yùn)行,而異常是主動(dòng)運(yùn)行;
5.3.2 運(yùn)行步驟基本一致異常和中斷運(yùn)行步驟應(yīng)當(dāng)是完全一直,但由于異常是主動(dòng)執(zhí)行,所以有些差別; 課本上(尤其計(jì)算機(jī)組成原理)關(guān)于中斷處理過(guò)程的描述并不全;因?yàn)樵敿?xì)過(guò)程會(huì)牽扯到軟件層面(操作系統(tǒng));所以自從中斷響應(yīng)(中斷隱指令)開(kāi)始,都是從內(nèi)核態(tài)的角度出發(fā),未涉及用戶(hù)態(tài),以及用戶(hù)態(tài)到核心態(tài)的轉(zhuǎn)換; 5.3.3 系統(tǒng)調(diào)用過(guò)程中是否可以被中斷?目前推測(cè)出:不可以被中斷,但是可以阻塞,主動(dòng)讓出CPU; 例:當(dāng)執(zhí)行讀文件操作時(shí),當(dāng)系統(tǒng)函數(shù)執(zhí)行完部分操作后,設(shè)置相應(yīng)操作參數(shù)后,主動(dòng)阻塞讓出CPU,系統(tǒng)調(diào)用和中斷處理程序一樣,都會(huì)關(guān)中斷,但是系統(tǒng)調(diào)用很多會(huì)設(shè)計(jì)IO指令,自動(dòng)阻塞,讓出CPU;
|
|
來(lái)自: 芥子c1yw3tb42g > 《謀生之道-自律自由》