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