linux程式設計之程序建立的內部實現

2021-08-01 10:54:02 字數 1109 閱讀 9255

在linux中,程序建立實際上是通過do_fork函式處理的。do_fork函式的功能相對簡單:

**在:kernel/fork.c

1.檢查是否或者哪個事件應該匯報給ptracer。

2.通過copy_process建立程序描述符和子程序執行所需要的其它資料結構。

3.執行wake_up_new_task函式,喚醒新程序。

4.結束並返回子程序的id

copy_process則負責對程序建立的相關資源的申請:

**在:kernel/fork.c

1.呼叫security_task_create以及稍後呼叫的security_task_alloc執行附加的安全檢查。

2.執行dup_task_struct複製父程序的task_struct描述符

3.初始化新結構體的各個字段:did_exec,utime,stime,gtime,irq_events,hardirqs_enabled等等

4.進行排程相關的初始化:perf_event_init_task,audit_alloc.

5.複製父程序的資訊到子程序:copy_semundo,copy_files,copy_fs,copy_mm等

6.初始化其它程序相關字段

7.將total_forks增加1

task_struct程序控制塊與程序位址空間的聯絡:

在task_struct結構體內的struct mm_struct成員執行記憶體區描述符的指標。在程序描述符中,還應該儲存程序空間的頁表資訊,和將邏輯位址轉換成頁號和頁內偏移位址所需的相關資訊。

通過總結可以得到:程序的建立的系統呼叫clone fork vfork都是呼叫do_fork實現的,而do_fork在做了一些引數檢查之後。呼叫了copy_process函式,copy_process函式在進行安全性檢查之後,使用dup_task_struct複製父程序的結構體。對新程序描述符的一些標誌資訊和時間資訊進行初始化,之後將父程序的所有程序資訊拷貝到子程序空間,包括io、檔案、記憶體資訊等。然後,設定新程序的pid,將新程序加入程序排程佇列中。子程序的eax設定為0,父程序則返回新程序的pid,所以在fork呼叫中,子程序返回的是0,父程序返回的是新程序的pid。詳細**分析,請參加附錄。

Linux程式設計 程序的建立

1.系統呼叫fork 允許乙個程序 父程序 建立一新程序 子程序 具體做法是 新的子程序幾乎是父程序的翻版,子程序獲得了父程序的棧 資料段 堆和執行文字段的拷貝。可視作將父程序一分為二,術語fork由此得名。fork 無需引數 2.庫函式exit status 終止乙個程序,將程序占用的所有資源 記...

linux程式設計之程序控制

一 fork include pid t fork void 返回值 有兩個,乙個是子程序的id,另乙個為零。當返回值為0時,進入子程序,大於0進入父程序,返回 1時建立程序錯誤。子程序與父程序的比較 1 子程序與父程序的程序id不同。且父程序id不同。2 記憶體布局 子程序是父程序的副本,其中子程...

Linux系統程式設計之程序

程序狀態 4 5種 就緒 初始化 執行,掛起 等待 停止 pbc成員 1 程序id 2 程序狀態 3 程序切換需要儲存和恢復的cpu暫存器 4 描述虛擬位址空間資訊 5 描述控制終端的資訊 6 當前工作目錄 7 umask掩碼 8 檔案描述符 9 訊號相關的資訊 10 使用者和使用者組id 11 會...