fork系統呼叫過程

2021-08-03 23:31:14 字數 1598 閱讀 8224

又是查詢資料,又是看原始碼,折騰了大半天,終於把fork的過程弄完了,但是後面的跟蹤狀態還不太懂,等具體後面弄清楚了,再加上。

核心是2.6.11版本的。

fork()系統呼叫:

我們執行乙個系統呼叫時,系統將呼叫巨集指令_syscall0

#define _syscall0(type,name) \

type

name(

void) \

進而,呼叫0x80號中斷,中斷0x80 把呼叫(控制)傳給核心入口位址中的system_call()負責保護所有的暫存器,並檢查系統呼叫是否合法,如果合法那麼根據從sys_call_table中找出的偏移量,把控制權轉給真正的系統。

當使用者呼叫int 0x80而進入system_call函式後,首先檢查用來存放系統呼叫編號的eax的值是否超出idt表的項數nr_syscalls如沒有超出的話,就根據eax的值從系統呼叫表(sys_call_table)中得到對應的系統呼叫入口,並通過call 指令轉入各個具體函式(sys_*)的處理過程。)

對esp和eip進行處理,使其指向核心棧。然後把暫存器eax中的系統呼叫號入棧。

然後當切換到到核心態後,核心根據系統呼叫號來查詢到對應的系統呼叫處理例程的

函式名(sys_fork),從而找到對應的**入口址。

long sys_fork(void)

這裡面current->thread.forking 記錄了程序複製的過程,與複製本身無關。

sys_fork(void)中呼叫do_fork()函式。

long do_fork(unsigned long clone_flags,

unsigned long stack_start,

struct pt_regs *regs,

unsigned long stack_size,

int __user *parent_tidptr,

iner *cild_tidptr )

do_fork()中首先通過查詢pidmap_array點陣圖,為子程序分配新的pid

long pid = alloc_pidmap();

copy_process複製程序描述符.如果所有必須的資源都是可用的,該函式返回剛建立

的task_struct描述符的位址. 這是建立程序的關鍵步驟.

struct task_struct *p;

p =copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr, pid);

如果父子程序執行在同乙個cpu上,並且不能共享同一組頁表(clone_vm標誌被清0).那麼,就把子程序插入父程序執行佇列.

並且子程序插在父程序之前.這樣做的目的是:如果子程序在建立之後執行新程式,就可以避免寫時複製機制執行不必要時頁面複製.

否則,如果執行在不同的cpu上,或者父子程序共享同一組頁表.就把子程序插入父程序執行佇列的隊尾.

系統呼叫過程詳解

整個過程如下 首先指令流執行到系統呼叫函式時,系統呼叫函式通過int 0x80指令進入系統呼叫入口程式,並且把系統呼叫號放入 eax中,如果需要傳遞引數,則把引數放入 ebx,ecx和 edx中。進入系統呼叫入口程式 system call 後,它首先把相關的暫存器壓入核心堆疊 以備將來恢復 這個過...

Linux系統呼叫過程

linux系統分為核心空間和使用者空間 應用程式通過引發乙個異常來促使系統切換到核心狀態 去執行系統呼叫的處理函式 對於ia 32體系 通過int 0x80指令觸發該中斷 具體可參考gun庫 sysdeps unix sysv linux arch syscall.s 當系統呼叫 open read...

fork系統呼叫的執行過程

1.linux提供了三個系統呼叫用於建立程序,分別是fork,vfork,clone fork系統呼叫 核心採用寫時複製技術對傳統的fork函式進行了下面的優化.即子程序建立後,父子程序以唯讀的方式共享父程序的資源 並不包括父程序的頁表項 當子程序需要修改程序位址空間的某一頁時,才為子程序複製該頁....