学号20145209《信息安全系统设计基础》第11周学习总结
學號20145209《信息安全系統(tǒng)設計基礎》第11周學習總結
教材學習內(nèi)容總結
教材學習內(nèi)容總結
第八章 異常控制流
1、從給處理器加電開始,直到斷點為止,程序計數(shù)器假設一個值的序列
a0,a1,……,an-1
每個ak是某個相應的指令Ik的地址。每次從ak到ak+1的過渡稱為控制轉移。這樣的控制轉移序列叫做處理器的控制流。
2、異常控制流:現(xiàn)代系統(tǒng)通過使控制流發(fā)生突變來對這些情況作出反應。
8.1異常
1、異常是異常控制流的一種形式,它一部分是由硬件實現(xiàn)的,一部分是有操作系統(tǒng)實現(xiàn)的。
2、異常:控制流中的突變,用來響應處理器狀態(tài)中的某些變化。
3、在處理器中,狀態(tài)被編碼為不同的位和信號。狀態(tài)變化成為事件。
4、異常表:當處理器監(jiān)測到有時間發(fā)生時,通過一張叫做異常表的跳轉表,進行一個間接過程調(diào)用,到一個專門設計用來處理這類事件的操作系統(tǒng)子程序(異常處理程序)。
5、當異常處理程序完成處理后,根據(jù)引起異常的事件的類型,會發(fā)生以下三種情況的一種:
(1)處理程序將控制返回給當前指令Icurr,即當事件發(fā)生時正在執(zhí)行的指令。
(2)處理程序將控制返回給Inext,即如果沒有發(fā)生異常將會執(zhí)行的下一條指令。
(3)處理程序終止被中斷的程序。
8.1.1 異常處理
1、系統(tǒng)中可能的每種類型的異常都分配了一個唯一的非負整數(shù)的異常號。
異常號的分配:
(1)處理器的設計者:被除零、缺頁、存儲器訪問違例、斷點以及算數(shù)溢出。
(2)操作系統(tǒng)內(nèi)核的設計者分配的:系統(tǒng)調(diào)用和來自意外不I/O設備的信號。
2異常號:到異常表中的索引
異常表基址寄存器:異常表的起始地址存放的位置。
3、異常與過程調(diào)用的異同:
(1)過程調(diào)用時,在跳轉到處理器之前,處理器將返回地址壓入棧中。然而,根據(jù)異常的類型,返回地址要么是當前指令,要么是下一條指令。
(2)處理器把一些額外的處理器狀態(tài)壓入棧里,在處理程序返回時,重新開始被中斷的程序會需要這些狀態(tài)。
(3)如果控制從一個用戶程序轉移到內(nèi)核,那么所有這些項目都被壓到內(nèi)核棧中,而不是壓到用戶棧中。
(4)異常處理程序運行在內(nèi)核模式下,意味著它們對所有的系統(tǒng)資源都有完全的訪問權限。
8.1.2 異常的類別
1、異常的分類:中斷、陷阱、故障和終止。
2、中斷:異步發(fā)生,是來自處理器外部的I/O設備的信號的結果。
(1)硬件異常中斷處理程序通常稱為中斷處理程序。
(2)異步異常是有處理器外部的I/O設備中的時間產(chǎn)生的,同步異常是執(zhí)行一條指令的直接產(chǎn)物。
(3)陷阱、故障、終止時同步發(fā)生的,是執(zhí)行當前指令的結果,我們把這類指令叫做故障指令。
3、陷阱和系統(tǒng)調(diào)用
(1)陷阱最重要的用途是在用戶程序和內(nèi)核之間提供一個像過程一樣的接口,叫做系統(tǒng)調(diào)用。
(2)普通的函數(shù)運行在用戶模式中,用戶模式限制了函數(shù)可以執(zhí)行的指令的類型,而且它們只能訪問與調(diào)用函數(shù)相同的棧。系統(tǒng)調(diào)用運行在內(nèi)核模式中,內(nèi)核模式允許系統(tǒng)調(diào)用執(zhí)行指令,并訪問定義在內(nèi)核中的棧。
4、故障:是由錯誤情況引起的。
例如:abort例程會終止引起故障的應用程序。 根據(jù)故障是否能夠被修復,故障處理程序要么重新執(zhí)行引起故障的指令,要么終止。
例如:缺頁故障。
5、終止:是不可恢復的致命錯誤造成的結果,通常是一些硬件錯誤。終止處理程序從不將控制返回給應用程序。
8.2 進程
1、異常是允許操作系統(tǒng)提供進程的概念所需要的基本構造塊。
進程:一個執(zhí)行中的程序的實例。
上下文是由程序正確運行所需要的狀態(tài)組成的,這個狀態(tài)包括存放在存儲器中的程序的代碼和數(shù)據(jù),它的棧、通用目的寄存器的內(nèi)容、程序計數(shù)器、環(huán)境變量以及打開文件描述符的集合。
2、進程提供給應用程序的關鍵抽象:
一個獨立的邏輯控制流,獨占地使用處理器;
一個私有的地址空間,獨占地使用存儲器系統(tǒng)。
8.2.1 邏輯控制流
1、程序計數(shù)器:唯一的對應于包含在程序的可執(zhí)行目標文件中的指令,或者是包含在運行時動態(tài)鏈接到程序的共享對象中的指令。這個PC值的序列叫做邏輯控制流,簡稱邏輯流。
8.2.2 并發(fā)流
1、并發(fā)流:一個邏輯流的執(zhí)行在時間上與另一個流重疊。
并發(fā):多個流并發(fā)地執(zhí)行的一般現(xiàn)象。
多任務:一個進程和其他進程輪流運行的概念。
時間片:一個進程執(zhí)行它的控制流的一部分的每一時間段。
多任務也叫時間分片。
2、并行流:如果兩個流并發(fā)的運行在不同的處理器核或者計算機上。
8.3 系統(tǒng)調(diào)用錯誤處理
錯誤處理包裝函數(shù):包裝函數(shù)調(diào)用基本函數(shù),檢查錯誤,如果有任何問題就終止。
8.4 進程控制
8.4.1 獲取進程ID
1、每個進程都有一個唯一的正數(shù)的進程ID。
2、getpid函數(shù)返回調(diào)用進程的PID,getppid函數(shù)返回它的父進程的PID。上面兩個函數(shù)返回一個同類型為pid_t的整數(shù)值,在linux系統(tǒng)中,它在types.h中被定義為int。
8.4.2 創(chuàng)建和終止進程
1、進程總處于三種狀態(tài)
(1)運行:進程要么在CPU上執(zhí)行,要么在等待被執(zhí)行且最終會被內(nèi)核調(diào)度。
(2)停止:程序的執(zhí)行被掛起,,且不會被調(diào)度。
(3)終止:進程用永遠停止了。
終止原因:
(1)收到一個信號,默認行為是終止進程
(2)從主進程返回
(3)調(diào)用exit函數(shù)
2、父進程通過調(diào)用fork函數(shù)創(chuàng)建一個新的運行的子進程。
3、子進程和父進程的異同:
異:有不同的PID
同:用戶級虛擬地址空間,包括:文本、數(shù)據(jù)和bss段、堆以及用戶棧。任何打開文件描述符,子進程可以讀寫父進程中打開的任何文件。
4、fork函數(shù): 因為父進程的PID總是非零的,返回值就提供一個明確的方法來分辨程序是在父進程還是在子進程中執(zhí)行。
fork函數(shù)的特點:
(1)調(diào)用一次,返回兩次
(2)并發(fā)執(zhí)行
(3)相同的但是獨立的地址空間
(4)共享文件
8.4.3 回收子進程
1、當父進程回收已終止的子進程時,內(nèi)核將子進程的退出狀態(tài)傳遞給父進程,然后拋棄已終止的進程。
一個終止了但還未被回收的進程稱為僵死進程。
2、一個進程可以通過調(diào)用waitpid函數(shù)來等待它的子進程終止或者停止。
include <sys/types.h>
include <sys/wait.h>
pid_t waitpid(pid_t pid,int *status,int options);
//返回:若成功,返回子進程的PID;若WNOHANG,返回0;若其他錯誤,返回-1。
默認地,當option=0時,waitpid掛起調(diào)用進程的執(zhí)行,直到它的等待集合中的一個子進程終止。
3、判定等待集合的成員
有參數(shù)pid來確定的:
(1)pid>0:等待集合是一個單獨的子進程,進程ID等于pid。
(2)pid=-1:等待結合就是由父進程所有的子進程組成的。
4、修改默認行為
通過options設置:
(1)WNOHANG:默認行為是掛起調(diào)用進程。
(2)WUNTRACED:默認行為是只返回已終止的子進程。
(3)WNOHANG|WUNTRACED:立即返回,如果等待集合中沒有任何子進程被停止或者已終止,那么返回值為0,或者返回值等于那個被停止或者已經(jīng)終止的子進程的PID。
5、檢查已回收子進程的退出狀態(tài)
wait.h頭文件定義了解釋status參數(shù)的幾個宏:
(1)WIFEXITED:如果子進程通過調(diào)用exit或者一個返回正常終止,就返回真;
(2)WEXITSTATUS:返回一個正常終止的子進程的退出狀態(tài)。只有在WIFEXITED返回真時,才會定義這個狀態(tài)。
6、錯誤條件
(1)若調(diào)用進程沒有子進程,那么waitpid返回-1,并且設置errno為ECHILD;
(2)若waitpid函數(shù)被一個信號中斷,那么返回-1,并設置errno為EINTR
7、wait函數(shù)
include <sys/types.h>
include <sys/wait.h>
pid_t wait(int *status);
//返回:若成功,返回子進程的PID;若錯誤,返回-1。
調(diào)用wait(&status)等價于調(diào)用waitpid(-1.&status,0)
8.4.4 讓進程休眠
1、sleep函數(shù):將進程掛起一段指定的時間
include
unsigned int sleep(unsigned int secs);
//返回:還要休眠的秒數(shù)
如果請求的時間量已經(jīng)到了,返回0,否則返回還剩下的要休眠的秒數(shù)。
2、pause函數(shù):讓調(diào)用函數(shù)休眠,直到該進程收到一個信號。
include
int pause(void);
//返回:總是-1
8.4.5 加載并運行程序
1、execve函數(shù):在當前進程的上下文中加載并運行一個新程序。
include
int execve(const char filename,const char argv[],const char *envp[]);
//返回:若成功,則不返回,若錯誤,返回-1
filename:可執(zhí)行目標文件
argv:帶參數(shù)列表
envp:環(huán)境變量列表
特點:execve調(diào)用一次從不返回
2、getenv函數(shù):在環(huán)境數(shù)組中搜素字符串“name =VALUE”,若找到了,就返回一個指向value的指針,否則它就返回NULL。
include
char getenv(const char name);
//返回:存在,返回指向name的指針,若無匹配的,為NULL
3、注意:
execve函數(shù)在當前進程的上下文中加載并運行一個新的進程。它會覆蓋當前進程的地址空間,并沒有創(chuàng)建一個新的進程,新的進程仍然有相同的PID,并且繼承了調(diào)用execve函數(shù)時已打開的所有文件描述符。
8.4.6 利用fork和execve運行程序
1、外殼是一個交互型的應用級程序,它代表用戶運行其他程序。
2、外殼執(zhí)行一系統(tǒng)的讀/求值步驟,然后終止。讀步驟讀取來自用戶的一個命令行,求值步驟解釋命令行,并代表用戶運行程序。
3、eval函數(shù):對外殼命令行求值
4、parseline函數(shù):解析外殼的一個輸入
8.5 信號
底層的硬件異常是由內(nèi)核異常處理程序處理的,正常情況下,對用戶進程而言是不可見的。
其他信號對應于內(nèi)核或者其他用戶進程中較高層的軟件事件。
8.5.1 信號術語
1、發(fā)送信號的兩個不同步驟:
(1)發(fā)送信號:內(nèi)核通過更新目的進程上下文中的某個狀態(tài),發(fā)送(遞送)一個信號給目的進程。
(2)接收信號:信號處理程序捕獲信號的基本思想。
發(fā)送信號的兩個原因:
(1)內(nèi)核監(jiān)測到一個系統(tǒng)事件,比如被零除錯誤或者子進程終止。
(2)一個進程調(diào)用了kill函數(shù),顯式地要求內(nèi)核發(fā)送一個信號給目的進程。一個進程可以發(fā)送信號給它自己。
2、待處理信號:一個只發(fā)出而沒有被接收的信號
一個進程可以有選擇性地阻塞接收某種信號。
待處理信號不會被接收,直到進程取消對這種信號的阻塞。
3、一個待處理信號最多只能被接受一次,pending位向量:維護著待處理信號集合,blocked向量:維護著被阻塞的信號集合。
學習進度條
| 目標 | 5000行 | 30篇 | 400小時 | |
| 第一周 | 200/200 | 2/2 | 20/20 | |
| 第二周 | 300/500 | 2/4 | 18/38 | |
| 第三周 | 500/1000 | 3/7 | 22/60 | |
| 第四周 | 300/1300 | 2/9 | 30/90 |
參考資料
- 《深入理解計算機系統(tǒng)V2》學習指導
- ...
轉載于:https://www.cnblogs.com/liuyiyang/p/6107405.html
總結
以上是生活随笔為你收集整理的学号20145209《信息安全系统设计基础》第11周学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异常分析
- 下一篇: mysql导入sql脚本命令