1. 從某個中斷開始 INT 0X80中斷,進入內核 ,調用函數就是system_call ,接下來就是執行system_call 2. 五段論中的中斷入口和中斷出口以及schedule 1. 首先又壓棧一些用戶態的信息, 2. 接下來就是具體去處理sys_fork,也就是中斷要產生的效果,但是在執 ...
1. 從某個中斷開始
INT 0X80中斷,進入內核 ,調用函數就是system_call,接下來就是執行system_call
2. 五段論中的中斷入口和中斷出口以及schedule
- 首先又壓棧一些用戶態的信息,
- 接下來就是具體去處理sys_fork,也就是中斷要產生的效果,但是在執行sys_fork的時候可能引起切換,
- 接下來就是看當前PCB中的state是否等於0,如果不是那麼就要進行調度,就是靠schedule,完成五端論中的中間三步
- 看它的時間片是否等於0,時間片用光了也要進行調度
- 最後就是執行中斷返回的函數ret_from_sys_call,iret也就是從內核棧到用戶棧的切換
- 下圖,在ret_from_sys_call中,首先popl一些信息,就是和壓棧的信息對應,然後就是iret
關於schedule
- 調度的話首先要找下一個線程,這個在後面講調度的時候詳細說
- switch_to裡面完成切換
- 把當前cpu中的所有指令放在當前TR指向的段中,也就是把當前執行的信息拍下來放到原tss中,
- 開始執行長跳轉指令,
- 把TSS(n)指給TR,也就是把新tss里的信息扣到cpu上
關鍵三步驟:
- INT中斷 進入內核
- schedule的里的switch_to里的ljmp完成切換
- ret_from_sys_call里的iret中斷出口
3. ThreadCreate
tss是寄存器,TCB(線程式控制制塊)
創建一個線程就是做出能切換的樣子,核心就是上面切換時用到的tss
首先要有TCB,然後是內核棧,把tss做好就行了
copy_process函數在進程創建的fork函數中調用,主要完成進程數據結構,各種資源的初始化。初始化方式可以重新分配,也可以共用父進程資源,主要根據傳入CLONE參數來確定。
- 申請記憶體空間,註意這是在內核中,用get_free_page(),而不是malloc
4. 如何執行我們想要的代碼?
從exec這個系統調用開始
exec函數提供了一個在進程中啟動另一個程式執行的方法