2018-2019-1 20165336《資訊安全系統設計基礎》第七週學習總結
阿新 • • 發佈:2018-11-10
1.學到的知識點
異常
- 系統呼叫屬於異常中的陷阱。系統呼叫的處理:陷阱處理程式將控制返回值給應用程式控制流中的下一條指令。
- Linux中,訊號(Signal)是一種使用者層異常控制流。
- 中斷是硬體層的異常控制流
- 非同步異常是同處理器外部的I/O裝置中的事件產生的(硬體產生),同步異常是執行一條指令的直接產物(軟體產生)。
- 陷阱是有意的異常,是執行一條指令的結果;故障由錯誤情況引起,他可能能夠被故障處理程式修正;中之事不可恢復的致命錯誤造成的結果,通常是一些硬體錯誤。
- 異常表是一張跳轉表,其中表目k包含異常k的處理程式程式碼的地址。
- 異常表的起始地址存放在異常表基址暫存器中。異常處理程式執行在核心模式下。
- 系統中可能的每種型別的異常都分配了一個唯一的非負整數的異常號。
程序
- 從程式設計師角度看程序狀態有執行、停止、終止。
- 使用者程序可以通過系統呼叫來訪問核心程式碼和資料。
- int main(){} 的返回值是0,會呼叫exit(0),在命令列中執行echo $? 的值是0,main中不呼叫exit,會補上exit(0)。
- 非本地跳轉通過setjmp和longjmp函式來提供的
- x86-64中,Linux系統呼叫的系統呼叫號是通過%rax傳遞的。
- 呼叫wait(&status)等價於呼叫waitpid(-1,%status,0)
- 如果一個父程序終止了,核心會安排init程序成為他的孤兒程序的養父。
- waitpid掛起呼叫程序的執行,直到他的等待集合中的一個子程序終止。
- 如果statusp引數是非空的,那麼waitpid就會在status中放上關於導致返回的子狀態資訊。
- Unix/Linux中通過呼叫fork()可以獲取子程序PID。
- Unix/Linux中通過呼叫getppid()可以獲取父程序PID。
- 程序排程由核心中的排程器處理完成
- 上下文就是核心重新啟動一個被搶佔的程序所需的狀態。他由一些物件的值組成,這些物件包括通用目的暫存器、浮點暫存器、程式計數器、使用者棧、狀態暫存器、核心棧和各種核心資料結構。
- .程序排程中的上下文切換包括儲存當前程序的上正文,恢復某個先前被搶佔的程序被儲存的上下文,將控制傳遞給這個新恢復的程序。
- 如果兩個流併發的執行在不同的處理器和或者計算機上,那我們稱他們併發的執行。
- 通過把處理程式的地址傳遞到signal函式從而改變預設行為,這叫設定訊號處理程式。執行訊號處理程式被稱為處理訊號。
- 每種型別最u多隻能有一個未處理的訊號,如果兩種型別k的訊號發給同一個目的程序,第二個訊號就簡單的被遺棄了。
- kill函式傳送訊號號碼sig給程序pid,可以用sigaction()處理訊號
- fork()呼叫一次返回兩次,在子程序中,fork返回值為0.
- 父程序和子程序都把它們的輸出顯示在螢幕上。原因是子程序繼承了父程序所有的開啟檔案。
- 子程序和父程序的使用者級虛擬地址空間相同但獨立
- 呼叫fork(2)的系統呼叫號是57
- 程序呼叫了exec系列函式後,程式碼會改變。exec系列函式中帶e的要傳入環境變數引數.不能用char[][] 來傳遞argv,結尾的0(null)無法處理;system=fork+exec+wait;
- 地址空間底部是保留給使用者程式的,包括通常的程式碼、資料、堆和棧段。程式碼段總是0x400000開始。
- 即使在系統中通常有許多程式在執行,程序也可以像每個程式提供一種假象,好像他在獨佔的使用處理器。這個PC的序列叫做邏輯控制流。
- C語言中有syscall函式可以直接呼叫任何系統呼叫
2.班課作業
1、使用man ls檢視ls的幫助手冊,通過實踐搞清楚ls各種引數對應的功能並提交實踐截圖。
參考https://wenku.baidu.com/view/a164dc08f78a6529647d53a6.html?from=related&hasrec=1
2、實現ls
要求:參考虛擬碼實現ls的功能
開啟目錄檔案
針對目錄檔案:
--讀取目錄條目
--顯示檔名
關閉檔案目錄檔案
3、實現ls -l