信息安全系统设计基础第十一周 20135218 姬梦馨
第8章 異常控制流
控制流:控制轉(zhuǎn)移序列。
控制轉(zhuǎn)移:從一條指令到下一條指令。例:從k到k+1的過(guò)渡稱為控制轉(zhuǎn)移。
異常控制流:現(xiàn)代操作系統(tǒng)通過(guò)使控制流發(fā)生突變來(lái)對(duì)系統(tǒng)狀態(tài)做出反應(yīng),這些突變稱為異常控制流。
平滑:指在存儲(chǔ)器中指令都是相鄰的。
突變:出現(xiàn)不相鄰,通常由諸如跳轉(zhuǎn)、調(diào)用、和返回等指令造成。
8.1 異常
異常是ECF的一種,一部分由硬件實(shí)現(xiàn),一部分由操作系統(tǒng)實(shí)現(xiàn)。就是位于硬件和操作系統(tǒng)之間的ECF。
硬件上,系統(tǒng)狀態(tài)實(shí)際是處理器的狀態(tài),處理器的狀態(tài)通常就是不同的位和信號(hào)(寄存器的位),處理器狀態(tài)的變化(比如說(shuō)某個(gè)bit置一)稱為事件。
出現(xiàn)異常的處理方式:
1.處理器檢測(cè)到有異常發(fā)生
2.通過(guò)異常表,進(jìn)行間接過(guò)程調(diào)用,到達(dá)異常處理程序
3.完成處理后:①返回給當(dāng)前指令②返回給下一條指令③終止
異常的類(lèi)別
異常的類(lèi)別——中斷、陷阱、故障和終止
1? 中斷處理:異步是指硬件中斷不是由任何一條指令造成的,而是由外部I/O設(shè)備的事件造成的。
? 中斷處理程序——異步異常——由處理器外部I/O設(shè)備中的事件產(chǎn)生的。同步異常是執(zhí)行一條指令的直接產(chǎn)物。
2? 陷阱和系統(tǒng)調(diào)用:系統(tǒng)調(diào)用是一些封裝好的函數(shù),內(nèi)部通過(guò)指令int n實(shí)現(xiàn)。
3? 陷阱最重要的用途是提供系統(tǒng)調(diào)用。系統(tǒng)調(diào)用運(yùn)行在內(nèi)核模式中,并且可以訪問(wèn)內(nèi)核中的棧。
? 陷阱最重要的用途是在用戶程序和內(nèi)核之間提供一個(gè)像過(guò)程一樣的接口,叫做系統(tǒng)調(diào)用。
4? 系統(tǒng)調(diào)用的參數(shù)是通過(guò)通用寄存器而不是棧來(lái)傳遞的,如,%eax存儲(chǔ)系統(tǒng)調(diào)用號(hào),%ebx,%ecx,%edx,%esi,%edi,%ebp最多存儲(chǔ)六個(gè)參數(shù),%esp不能用,因?yàn)檫M(jìn)入內(nèi)核模式后,會(huì)覆蓋掉它。
5? 故障
6? 一個(gè)經(jīng)典的的故障示例是缺頁(yè)異常,當(dāng)指令引用一個(gè)虛擬地址,而該虛擬地址相對(duì)應(yīng)的物理頁(yè)面不在存儲(chǔ)器中,因此必須從磁盤(pán)中取出時(shí),就會(huì)發(fā)生故障。
7? 終止
8? 終止是不可恢復(fù)的致命錯(cuò)誤造成的結(jié)果,通常是一些硬件錯(cuò)誤,比如DRAM或者SRAM位被損壞時(shí)發(fā)生的奇偶錯(cuò)誤。終止處理程序從不將控制返回給應(yīng)用程序。處理程序?qū)⒖刂品祷亟o一個(gè)abort例程,該例程會(huì)終止這個(gè)應(yīng)用程序。
系統(tǒng)中每種類(lèi)型的異常都分配了一個(gè)唯一的非負(fù)整數(shù)的異常號(hào),一些是處理器設(shè)計(jì)者分配的:零除、缺頁(yè)、存儲(chǔ)器訪問(wèn)違例、斷點(diǎn)、算術(shù)溢出
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一些是操作系統(tǒng)內(nèi)核設(shè)計(jì)者分配的:系統(tǒng)調(diào)用、來(lái)自外部I/O設(shè)備的信號(hào)。
我們將系統(tǒng)調(diào)用和與它們相關(guān)聯(lián)的包裝函數(shù)稱為系統(tǒng)級(jí)函數(shù)。8.2 進(jìn)程
異常是允許操作系統(tǒng)提供進(jìn)程的概念所需要的基本構(gòu)造塊。
進(jìn)程(操作系統(tǒng)層):邏輯控制流,私有地址空間,多任務(wù),并發(fā),并行,上下文,上下文切換,調(diào)度。
進(jìn)程提供給應(yīng)用程序的關(guān)鍵抽象:
一個(gè)獨(dú)立的邏輯控制流,它提供了一個(gè)假象,好像我們的程序獨(dú)占的使用處理器。
一個(gè)私有的地址空間,它提供了一個(gè)假象,好像我們的程序獨(dú)占的使用存儲(chǔ)器系統(tǒng)。
上下文是集合,進(jìn)程其實(shí)是這個(gè)集合下實(shí)際一條一條執(zhí)行代碼的過(guò)程。進(jìn)程包含上下文以及執(zhí)行的過(guò)程。
PC值的序列稱為邏輯控制流。
并發(fā)流:
1? 并發(fā)流:并發(fā)流一個(gè)邏輯流的執(zhí)行在時(shí)間上與另一個(gè)流重疊,叫做并行流
2? 并發(fā):多個(gè)流并發(fā)執(zhí)行的一般現(xiàn)象稱為并發(fā)。
3? 多任務(wù):多個(gè)進(jìn)程并發(fā)叫做多任務(wù)。
4? 并行:并發(fā)流在不同的cpu或計(jì)算機(jī)上,叫做并行。
多個(gè)流并發(fā)的執(zhí)行的一般現(xiàn)象稱為并發(fā)。
一個(gè)進(jìn)程和其他進(jìn)程輪流運(yùn)行的概念稱為多任務(wù)。
x86 linux地址空間頂部是保留給內(nèi)核的:代碼、數(shù)據(jù)、棧。
操作系統(tǒng)內(nèi)核使用一種較高層次的異常控制流來(lái)實(shí)現(xiàn)多任務(wù)。這種異常控制流稱為上下文切換。
上下文切換是建立在前面的4種異常的基礎(chǔ)上的。內(nèi)核為每個(gè)進(jìn)程維持一個(gè)上下文,上下文就是內(nèi)核重新啟動(dòng)一個(gè)被搶占的進(jìn)程所需的狀態(tài)。在進(jìn)程執(zhí)行的某些時(shí)刻,內(nèi)核可以決定搶占當(dāng)前進(jìn)程,并重新開(kāi)始一個(gè)先前被搶占的進(jìn)程。這種決定就叫做調(diào)度,是由內(nèi)核中稱為調(diào)度器的代碼處理的。
上下文切換:
保存當(dāng)前進(jìn)程的上下文。 恢復(fù)某個(gè)先前被搶占的進(jìn)程被保存的上下文。 將控制傳遞給這個(gè)新恢復(fù)的進(jìn)程。?
8.3 系統(tǒng)調(diào)用錯(cuò)誤
1:當(dāng)UNIX系統(tǒng)級(jí)函數(shù)遇到錯(cuò)誤時(shí),它們典型地會(huì)返回-1,并設(shè)置全局整數(shù)變量errno來(lái)表示什么出錯(cuò)了。2:通過(guò)使用錯(cuò)誤處理包裝函數(shù),我們可以更進(jìn)一步地簡(jiǎn)化我們的代碼。對(duì)于一個(gè)給定的基本函數(shù)foo,我們定義一個(gè)具有相同參數(shù)的包裝函數(shù)Foo,但是第一個(gè)字母大寫(xiě)了。包裝函數(shù)調(diào)用基本函數(shù),檢查錯(cuò)誤,如果有任何問(wèn)題就終止。
8.4 進(jìn)程控制
? ?進(jìn)程總處于下面三種狀態(tài)之一:
運(yùn)行——在cpu上運(yùn)行,或者,等待運(yùn)行且最終會(huì)運(yùn)行(會(huì)被內(nèi)核調(diào)度)停止——進(jìn)程被掛起(也就是被其他的進(jìn)程搶占了),且不會(huì)被調(diào)度,但可以被信號(hào)喚醒終止——進(jìn)程被永遠(yuǎn)的停止了,受到終止信號(hào),或者從主程序返回,或者調(diào)用exit函數(shù)。進(jìn)程會(huì)因?yàn)槿N原因終止進(jìn)程:收到信號(hào),該信號(hào)默認(rèn)終止進(jìn)程;從主程序返回;調(diào)用exit函數(shù)。
過(guò)程包括:
獲取進(jìn)程id
創(chuàng)建和終止進(jìn)程
回收子進(jìn)程
讓進(jìn)程休眠
加載并運(yùn)行程序
?回收過(guò)程中:
1? 回收:當(dāng)一個(gè)進(jìn)程終止時(shí),內(nèi)核并不立即把它從系統(tǒng)中清除。相反,進(jìn)程被保持在一種已終止的狀態(tài)中,直到被它的父進(jìn)程回收。
2? 僵死進(jìn)程:一個(gè)終止了但是還未被回收的進(jìn)程稱為僵死進(jìn)程。
3? 回收子進(jìn)程的兩種方法:1,內(nèi)核的init進(jìn)程 2,父進(jìn)程waitpid函數(shù)
4 ?waitpid函數(shù)有點(diǎn)復(fù)雜,默認(rèn)地(當(dāng)options=0時(shí)),waitpid掛起調(diào)用進(jìn)程的執(zhí)行,知道它的等待集合中的一個(gè)子進(jìn)程終止。?
讓進(jìn)程休眠:
1? sleep函數(shù)將一個(gè)進(jìn)程掛起一段指定的時(shí)間。?
2? 如果請(qǐng)求的時(shí)間量已經(jīng)到了,sleep返回0,否則返回還剩下的要休眠的秒數(shù)。后一種情況是可能的,如果因?yàn)閟leep函數(shù)被一個(gè)信號(hào)中斷而過(guò)早地返回。我們將在8.5節(jié)中詳細(xì)討論信號(hào)
3? pause函數(shù)讓調(diào)用函數(shù)休眠,直到該進(jìn)程收到一個(gè)信號(hào)。
?fork函數(shù)的三個(gè)參數(shù):pid、status、options。
wait函數(shù)等價(jià)于waitpid(-1, &status, 0)。
execve函數(shù)在當(dāng)前進(jìn)程的上下文中加載并運(yùn)行一個(gè)新程序。fork一次調(diào)用兩次返回,execve調(diào)用一次,從不返回。
?
?
fork函數(shù)和execve函數(shù)的區(qū)別: fork函數(shù)在新的子進(jìn)程中運(yùn)行相同的程序,新的子進(jìn)程是父進(jìn)程的一個(gè)復(fù)制品。 execve函數(shù)在當(dāng)前進(jìn)程的上下文中加載并運(yùn)行一個(gè)新的程序,它會(huì)覆蓋當(dāng)前進(jìn)程的地址空間,但并沒(méi)有創(chuàng)建一個(gè)新進(jìn)程。 新的程序仍然有相同的pid,并且繼承了調(diào)用execve函數(shù)時(shí)已打開(kāi)的所有文件描述符。8.5 信號(hào)
底層的硬件異常是由內(nèi)核異常處理程序處理的,
發(fā)送信號(hào)——內(nèi)核通過(guò)更新目的進(jìn)程上下文中的某個(gè)狀態(tài),告訴目的進(jìn)程,有一個(gè)信號(hào)來(lái)了。
接受信號(hào)——當(dāng)目的進(jìn)程被內(nèi)核強(qiáng)迫以某種方式對(duì)信號(hào)的發(fā)送做出反應(yīng)時(shí),目的進(jìn)程就接收了信號(hào)。
發(fā)送信號(hào)的方式/bin/kill、鍵盤(pán)發(fā)送信號(hào)、kill函數(shù)、alarm函數(shù)。
接收信號(hào):
1.忽略 2.終止 3.執(zhí)行信號(hào)處理程序,捕獲信號(hào)
?每個(gè)信號(hào)類(lèi)型都有一個(gè)預(yù)定的默認(rèn)行為:
(1)進(jìn)程終止
(2)進(jìn)程終止并轉(zhuǎn)儲(chǔ)存儲(chǔ)器
(3)進(jìn)程停止直到被SIGCONT型號(hào)重啟
(4)進(jìn)程忽略該信號(hào)
信號(hào)處理:
待處理信號(hào)被阻塞。Unix信號(hào)處理程序通常會(huì)阻塞當(dāng)前處理程序正在處理的類(lèi)型的待處理信號(hào)。
待處理信號(hào)不會(huì)排隊(duì)等待。任意類(lèi)型至多只有一個(gè)待處理信號(hào)。因此,如果有兩個(gè)類(lèi)型為K的信號(hào)傳送到一個(gè)目的進(jìn)程,而由于目的進(jìn)程當(dāng)前正在執(zhí)行信號(hào)K的處理程序,所以信號(hào)K時(shí)阻塞的,那么第二和信號(hào)就簡(jiǎn)單地被簡(jiǎn)單的丟棄,他不會(huì)排隊(duì)等待。
系統(tǒng)調(diào)用可以被中斷。像read、wait和accept這樣的系統(tǒng)調(diào)用潛在地會(huì)阻塞進(jìn)程一段較長(zhǎng)的時(shí)間,稱為慢速系統(tǒng)調(diào)用。在某些系統(tǒng)中,當(dāng)處理程序捕獲到一個(gè)信號(hào)時(shí),被中斷的慢速系統(tǒng)調(diào)用在信號(hào)處理程序返回時(shí)不再繼續(xù),而是立即返回給用戶一個(gè)錯(cuò)誤的條件,并將errno設(shè)置為EINTR。
三種方法
-
執(zhí)行默認(rèn)操作
-
忽略信號(hào)
-
捕捉信號(hào):執(zhí)行信號(hào)處理函數(shù),切換到用戶態(tài)。
捕捉:signal函數(shù)。
8.6 非本地跳轉(zhuǎn)
c語(yǔ)言提供一種用戶級(jí)異常控制流形式——非本地跳轉(zhuǎn)。
?c語(yǔ)言提供了一種用戶級(jí)異常控制流形式,稱為本地跳轉(zhuǎn)。通過(guò)setjmp和longjmp函數(shù)來(lái)提供。
? setjmp函數(shù)只被調(diào)用一次,但返回多次:一次是當(dāng)?shù)谝淮握{(diào)用setjmp,而調(diào)用環(huán)境保存在緩沖區(qū)env中時(shí),
一次是為每個(gè)相應(yīng)的longjmp調(diào)用。另一方面,longjmp只調(diào)用一次,但從不返回。
8.7 操作進(jìn)程的工具
- STRACE:打印一個(gè)正在運(yùn)行的程序和它的子進(jìn)程調(diào)用的每個(gè)系統(tǒng)調(diào)用的軌跡。對(duì)
- PS:列出當(dāng)前系統(tǒng)中的進(jìn)程(包括僵死進(jìn)程)
- TOP:打印出關(guān)于當(dāng)前進(jìn)程資源使用的信息。
- PMAP:顯示進(jìn)程的存儲(chǔ)器映射。proc:一個(gè)虛擬文件系統(tǒng),以ASCII文本格式輸出大量?jī)?nèi)核數(shù)數(shù)據(jù)結(jié)構(gòu)的內(nèi)容,用戶程序可 cat 2 / proc / load avg” , 觀察在Linux系統(tǒng)上的平均負(fù)載。
?
?參考資料
課本第八章,其中截圖均來(lái)自《深入理解計(jì)算機(jī)系統(tǒng)》pdf版。
?
轉(zhuǎn)載于:https://www.cnblogs.com/ShadowStealer/p/4987243.html
總結(jié)
以上是生活随笔為你收集整理的信息安全系统设计基础第十一周 20135218 姬梦馨的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦到和老公跳舞怎么回事
- 下一篇: win10下安装ubuntu14.04双