2018-2019-1 20165304 《信息安全系統設計基礎》第七周學習總結
阿新 • • 發佈:2018-11-11
自己 堆和棧 正整數 用處 image 參數 圖片 過程 調用函數
異常控制流
異常
異常是異常控制流的一種形式,它一部分由硬件實現,一部分由操作系統實現。異常就是控制流中的突變,用來響應處理器狀態中的某些變化。
異常可以分為四類:中斷、陷阱、故障、終止。
陷阱最重要的用途是在用戶程序和內核之間提供一個像過程一樣的接口,叫做系統調用。
C程序用syscall函數可以直接調用任何系統調用。在x86-64系統上,系統調用是通過一條稱為syscall的陷阱指令來提供的。
2.異常處理
系統中可能的類型的異常分配了一個唯一的非負整數的異常號。 處理器的設計者:被除零、缺頁、存儲器訪問違例、斷點以及算數溢出。 操作系統內核的設計者分配的:系統調用和來自意外不I/O設備的信號。 異常號:到異常表中的索引 異常表基址寄存器:異常表的起始地址存放的位置。 異常與過程調用的異同: 過程調用時,在跳轉到處理器之前,處理器將返回地址壓入棧中。然而,根據異常的類型,返回地址要麽是當前指令,要麽是下一條指令。 處理器把一些額外的處理器狀態壓入棧裏,在處理程序返回時,重新開始被中斷的程序會需要這些狀態。 如果控制從一個用戶程序轉移到內核,那麽所有這些項目都被壓到內核棧中,而不是壓到用戶棧中。 異常處理程序運行在內核模式下,意味著它們對所有的系統資源都有完全的訪問權限。
3.異常的類別
中斷:異步發生,是來自處理器外部的I/O設備的信號的結果。 硬件異常中斷處理程序通常稱為中斷處理程序。 異步異常是有處理器外部的I/O設備中的時間產生的,同步異常是執行一條指令的直接產物。 陷阱、故障、終止時同步發生的,是執行當前指令的結果,我們把這類指令叫做故障指令。 陷阱和系統調用: 陷阱最重要的用途是在用戶程序和內核之間提供一個像過程一樣的接口,叫做系統調用。 普通的函數運行在用戶模式中,用戶模式限制了函數可以執行的指令的類型,而且它們只能訪問與調用函數相同的棧。系統調用運行在內核模式中,內核模式允許系統調用執行指令,並訪問定義在內核中的棧。 陷阱是有意的異常,最重要的用途是在用戶程序和內核之間提供一個向過程一樣的接口,叫做系統調用。 為了允許內核服務的受控訪問,使用“syscall n”指令,跳轉到一個異常處理程序的陷阱,處理程序對參數解碼並調用適當的內核程序。 故障:是由錯誤情況引起的。 例如:abort例程會終止引起故障的應用程序。 根據故障是否能夠被修復,故障處理程序要麽重新執行引起故障的指令,要麽終止。例如:缺頁故障。 終止:是不可恢復的致命錯誤造成的結果,通常是一些硬件錯誤。 終止處理程序從不將控制返回給應用程序。 終止處理程序將控制直接返回給abort例程,直接終止該應用程序。
進程和並發
進程提供給應用程序的關鍵抽象: - 一個獨立的邏輯控制流,它提供一個假象,好像我們的程序獨占地使用處理器。 - 一個私有的地址空間,它提供一個假象,好像我們的程序獨占地使用內存系統。 一個邏輯流的執行在時間上與另一個流重疊,稱為並發流。多個流並發地執行的一般現象被稱為 並發 ,一個進程和其他進程輪流運行的概念稱為 多任務 ,一個進程執行它的控制流的一部分的每一時間段叫做 時間片 ,多任務也叫做 時間分片 。 並發流:兩個流在時間上重疊,即使它們是運行在同一個處理器上; 並行流:是並發流的一個真子集,如果兩個流並發地運行在 不同的 處理器核或者計算機上。 地址空間底部是保留給用戶程序的,包括通常的代碼、數據、堆和棧段。 代碼段總是從地址0x400000開始。地址空間頂部保留給內核。 地址空間的這個部分包含內核在代表進程執行指令時使用的代碼、數據和棧。 用戶程序必須通過系統調用接口間接地訪問內核代碼和數據。 調度是由內核中稱為調度器的代碼處理的。在內核調度了一個新的進程運行後,它就搶占當前進程,並使用一種稱為上下文切換的機制來將控制轉移到新的進程。 - 1.保存當前進程的上下文, - 2.恢復某個先前被搶占的進程被保存的上下文, - 3.將控制傳遞給這個新恢復的進程。
進程創建和控制的系統調用及函數
1.getpid和getppid
每個進程都有一個唯一的正數(非零)進程ID(PID).getpid函數返回調用進程的PID。getppid函數返回它的父進程的PID(創建調用進程的進程)。getpid和getppid函數返回一個類型為pid_t的整數值,在Linux系統上它在types.h中被定義為int。
2.exit
從程序員的角度,我們可以認為進程總是處於下面三種狀態之一:運行、停止、終止。
進程會因為三種原因終止:1.收到一個信號,該信號的默認行為是終止進程,2.從主程序返回,3.調用exit函數。
exit函數以status退出狀態來終止進程。
3.wait
調用wait(&status)等價於調用waitpid(-1,&status,0)。
4.fork
調用一次,返回兩次。一次返回到父進程,一次返回到新創建的子進程。
並發執行。父進程和子進程是並發運行的獨立進程。
相同但是獨立的地址空間。
共享文件。
5.exec
在使用exec函數族時,一定要加上錯誤判斷語句。因為exec很容易執行失敗,其中最常見的原因有:
- 找不到文件或路徑,此時errno被設置為ENOENT。
- 數組argv和envp忘記用NULL結束,此時errno被設置為EFAULT。
- 沒有對用可執行文件的運行權限,此時errno被設置為EACCES。
數組指針、指針數組、函數指針、指針函數的區別
數組指針是一個指針,該指針指向的是一個數組;
指針數組是一個數組,數組的元素保存的是指針;
函數指針是一個指針,該指針指向一個函數;
指針函數是一個函數,該函數返回的是一個指針。
信號機制
進程組:每個進程都只屬於一個進程組,進程組是由一個正整數進程組ID來標識的。getpgrp函數返回當前進程的進程組ID。默認地,一個子進程和它的父進程同屬於一個進程組。一個進程可以通過使用setpgid來改變自己或者其他進程的進程組。
/bin/kill程序可以向另外的進程發送任意的信號。
在任何時刻,至多只有一個前臺作業和0個或多個後臺作業。
進程通過調用kill函數發送信號給其他進程(包括它們自己)。
進程可以通過用alarm函數向它自己發送SIGALRM信號。
2018-2019-1 20165304 《信息安全系統設計基礎》第七周學習總結