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