
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函式提供了一個在行程中啟動另一個程式執行的方法



5. 總結

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/131384.html
標籤:Linux
