Linux0 11核心 fork 函式建立程序

2021-08-25 18:39:56 字數 914 閱讀 4393

用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...