天天看點

資訊安全系統設計基礎第十周學習總結

第八章異常控制流

第一節 異常

異常就是控制流的突變,用來響應處理器狀态中的某些變化。狀态變化稱為事件。在任何情況下,當處理器檢測到有事件時,通過一張叫做異常表的跳轉表,進行一個間接地過程調用,到一個專門設計用來處理這類時間的作業系統子程式

l  異常的類别:異常可以分為4類:中斷(interrupt)、陷阱(trap)、故障(fault)和終止(abort)。

中斷是異步發生的,是來自處理器外部的I/O裝置的信号的結果。

陷阱是有意的異常,是執行一條指令的結果。陷阱的最重要用途是執行系統調用。

故障是錯誤引起的,它可能被故障處理程式修正。一個經典的故障執行個體是缺頁異常

終止是不可恢複的緻命錯誤的結果,通常是一些硬體錯誤。

l  Linux/IA32系統中的異常

n  Linux/IA32故障和終止

除法錯誤(異常0) Linux外殼通常會把除法錯誤報告為“浮點異常”(Floating exception)。

一般保護故障(異常13) 許多原因會導緻不為人知的一般保護故障,通常是因為一個程式引用了一個未定義的虛拟存儲器區域,或者是因為試圖寫一個隻讀的文本段。Linux不會試圖恢複這類故障。Linux外殼通常将此報告為“段錯誤”(Segmentation fault)。

缺頁(異常14) 會重新執行産生故障的指令的一個異常執行個體。

機器檢查(異常18) 在導緻故障的指令執行中檢測到緻命的硬體錯誤時發生的。機器檢查處理程式從不傳回控制給應用程式。

n  Linux/IA32系統調用

 每個Linux系統調用,都有一個唯一的整數号,對應一個到核心中跳轉表的偏移量。

 曆史上,系統調用通過異常128(0x80)提供的。

 C程式可以直接用syscall函數直接調用任何系統調用,然而,實際中機會沒必要這麼沒做。對于大多數系統調用,标準C庫提供了一組友善的包裝函數。這些包裝函數将參數打包到一起,以合适的系統調用号陷入核心,然後将系統調用的傳回狀态傳遞回調用程式。

 所有的到Linux系統調用的參數都是通過寄存器而不是棧傳遞的。

 注意:異常作為通用的術語,在必要時才差別異步異常(中斷)和同步異常(陷阱、故障和終止)。

第二節:程序

l  程序的經典定義就是一個執行中的程式的執行個體。

l  程序提供給應用程式的關鍵抽象:一個獨立的邏輯控制流,它提供一個假象,好像我們的程式獨占地使用處理器。一個私有的位址空間,它提供一個假象,好像我們的程式獨占地使用存儲器系統。

l  一個邏輯流的執行在時間上與另一個流重疊,稱為并發流(concurrent flow),這兩個流稱之為并發地執行。多個流并發地執行的一般現象稱為并發(concurrency)。注意,并發的思想與流運作的處理器核數或者計算機數無關。如果兩個流在時間上重疊,那它們就是并發的。如果兩個流并發地運作在不同的處理器核或者計算機上,那麼我們稱它們為并行流(parallel flow)。

l  Linux提供了一種聰明的機制,叫做/proc檔案系統,它允許使用者模式程序通路核心資料結構。2.6版本的Linux核心引入/sys檔案系統,它輸出關于系統總線和裝置的額外的底層資訊。

第三節:系統調用錯誤處理

當Unix系統級函數遇到錯誤時,它們典型地傳回-1,并設定全局整數變量errno來表示什麼出錯了。

strerror函數傳回一個文本串,描述了某個error值相關聯的錯誤。

第四節:程序控制

l  每個程序都有一個唯一的正數程序ID(PID)。新建立的子程序幾乎但不完全與父程序相同。子程序得到與父程序使用者級虛拟位址空間相同的(但是獨立的)一份拷貝。子程序還繼承了父程序所有的打開檔案。父程序和新建立的子程序之間最大的差別是他們有不同的PID。

l  在棧的頂部是main函數的三個參數:1)envp,它指向envp[]數組;2)argv,它指向argv[]數組;3)argc,它給出argv[]中非空指針的數量。

第五節:信号

對于隻捕獲一個信号并終止的程式來說,信号處理是簡單直接的。然而當一個程式要捕獲多個信号時,一些細微的問題就産生了。

待處理信号不會排隊等待。任意類型至多隻有一個待處理信号。如果有兩個類型為k的信号傳送到一個目的程序,而目的程序目前正在執行信号k的處理程式,是以信号k是阻塞的,那麼第二個信号就被簡單地丢棄,它不會排隊等待。

系統調用可以被中斷。像read、write和accept這樣的系統調用,潛在地會阻塞程序一段較長的時間,稱為慢速系統調用。在某些系統中,當處理程式捕獲到一個信号時,被中斷的慢速系統調用在信号處理程式傳回時不再繼續,而是立即傳回給使用者一個錯誤條件,并将errno設定為EINTR。

第六節:非本地跳轉

 C語言提供了一種使用者級的異常控制流形式,稱為非本地跳轉(nonlocal jump),它将控制直接從一個函數轉移到另一個目前正在執行的函數,而不需要正常的調用-傳回序列。非本地跳轉通過setjmp和longjmp函數來提供的。

第七節:操作程序的工具

 Linux系統提供了大量的監控和操作程序的有用工具。

STRACE:列印一個正在運作程式和它的子程序調用的每個系統調用的軌迹。

PMAP:顯示程序的存儲器映射。