用fork建立程序
除了程序0,其它所有的程序都是fork產生的。子程序是通過複製父程序的資料和**產生的。建立結束後,子程序和父程序的**段、資料段共享。但是子程序有自己的程序控制塊、核心堆疊和頁表。
我們知道乙個程序需要有如下3個結構
1.task陣列中的一項,即程序控制塊(task_struct)
2.gdt中的兩項,即tss段和ldt段描述符
3.頁目錄和頁表
所以fork()的任務就是為乙個新程序構造這3個結構。
sys_fork() 系統呼叫的實現在2個檔案中。fork.c中的全部和system_call.s中_sys_fork。sys_fork()系統呼叫分成2步完成,第一步呼叫函式find_empty_process(),在task陣列中找一項空閒項,第二步呼叫copy_process() 函式,複製程序。
sys_fork() 入口
_sys_fork:
// 第一步,呼叫find_empty_process()函式,找task中的空閒項。
// 找到後陣列下標放在eax中。如果沒找到直接跳轉到ret指令。
call _find_empty_process
testl %eax,%eax
js 1f
push %gs // 中斷時沒有入棧的暫存器入棧,
// 作為copy_process() 函式的引數
pushl %esi
pushl %edi
pushl %ebp
pushl %eax
// 第二步,呼叫copy_process() 函式複製程序。
call _copy_process
addl $20,%esp
1: ret
程式呼叫copy_process() 函式時,
當前程序核心堆疊的情況如下:
Linux 0 11 核心筆記
1 任務0的堆疊問題 一直不明白schedule.c裡的task union的stack和user stack是什麼關係,head.s裡就設定了esp指向user stack,卻一直沒有用到task union,直到看到init task才明白,從進入保護模式到跳轉進使用者態都是用的user sta...
Linux0 11核心筆記( )
c語言 彙編知識 嵌入式彙編 x86處理器和程式設計的相關知識和 unix作業系統設計 linus在最初開發linux作業系統時參考了minix作業系統 作業系統 設計與實現 一種基於訊息傳遞在核心各模組之間進行通訊 資訊交換 重要的五個支柱 unix作業系統 分時作業系統 minix作業系統 gn...
Linux 0 11核心編譯問題
弄了好長時間,只是可以用linux 0.11我的linux實驗室環境,使用bochs模擬,進入linux 0.11 cd cd src linux make 這樣就編譯成image了 mkdir a mkdir a boot mcopy image a boot 將映象檔案拷貝到啟動軟盤 修改men...