6 Linux系統中的程序建立分析

2021-07-10 20:10:04 字數 2830 閱讀 6672

下面就進入實驗樓的環境開始實驗,

檢視test.c裡面的**如下:

啟動menuos後停止等待,開啟gdb除錯:

打好斷點:

接著在menuos介面輸入fork執行:

切換回shell命令列介面,輸入continue命令,走起:

fork執行完成後,執行結果如下圖:

1.程序間的狀態轉換

2.新程序的產生

話說,道生一(start_kernel、cpu_idle)、

一生二(kernel_init和kthreadd)、

二生三(即前面0,1和2三個程序)

1號程序是所有使用者態程序祖先、

0號程序是所有核心執行緒的祖先。

程序描述符pcb的資料結構是task_struct型別,它包括了程序相關的所有資訊,task_struct結構中主要有:

-程序狀態(記錄程序等待、執行或死鎖三種狀態)

-排程資訊

-識別符號

-程序間的通訊情況

-程序鏈結資訊(程序鍊錶的插入等操作資訊)

-時間和定時器資訊

-檔案系統資訊

-頁面管理資訊

-和處理器相關的環境上下文資訊

-...

其中:1)state欄位。用於描述程序當前的狀態,由一組標誌組成,每個標誌描述一種程序可能的狀態,這些狀態的是互斥的。

2)thread_info欄位。linux核心用共用體結構將乙個程序的執行緒描述符和核心堆疊

union thread_union

3)task欄位。所有的程序的描述符組成了乙個雙向鍊錶,task欄位的型別為list_head。

struct list_head

start_kernel中建立0號程序,由0號程序建立1號程序,1號程序是所有使用者態程序的祖先,0號程序是所有核心程序的祖先。使用者態程式通過呼叫 fork建立乙個有父子關係的新程序。  通過copy_thread複製現有程序實現建立新程序,先複製task_struct,再為其分配乙個核心棧,接著copy_process進行修改,如程序pid、程序鍊錶等。fork、vfork和clone三個系統呼叫都可建立乙個新程序,但都是通過do_fork實現的。

複製過程為:

1)err = arch_dup_task_struct(tsk, orig); // 複製乙個task_struct資料結構的pcb

2)ti = alloc_thread_info_node(tsk, node); tsk->stack = ti; // 給新程序分配乙個核心堆疊

3)setup_thread_stack(tsk, orig);   // 這裡只是複製thread_info,而非複製核心堆疊

4)*childregs = *current_pt_regs(); // 複製核心堆疊 

5)childregs->ax = 0; // 子程序的fork返回0的原因

建立好後執行到ret_from_fork,在ret_from_fork中會跳到syscall_exit,此時父程序的核心棧中儲存了執行fork前的上下文,子程序的核心棧中也從父程序那裡複製到的自己的上下文,所以現在父子程序可以等待被排程後正常執行啦。

總結:在linux中建立新程序中,用fork得到的子程序是父程序的複製,它從父程序處複製了整個程序的位址空間,包括進

程上下文、程序堆疊、記憶體資訊、開啟的檔案描述符、訊號控制設定、程序優先順序、程序組號、當前工作目錄、根目錄、資源限制、控制終端等。子程序所獨有的只是它的程序號、資源使用和計時器等。

1.無論用三種系統呼叫clone、fork、vfork中的哪種來建立乙個新程序,都是通過呼叫do_fork來實現的

2.通過複製父程序pcb的task_struct建立乙個新程序

3.子程序修改複製後的pcb,如pid、程序鍊錶等

4.fork()系統呼叫產生的子程序從ret_from_fork處開始執行,p->thread.ip = (unsigned long)ret_from_fork

5.可通過返回值判斷當前程序是父程序還是子程序,父程序處返回程序號,子程序自己返回0

6 linux中文的顯示

在 linux下輸入或顯示中文或通過 securecrt 連線linux 常有中仍亂碼 關鍵是 要設定中文 字符集,通過locale 這個變數。locale 是軟體在執行時的語言環境,它包括語言 language 地域 territory 和字符集 codeset 乙個locale 的書寫格式為 語...

6 linux下的幫助命令

內建命令實際上是 shell 程式的一部分,其中包含的是一些比較簡單的 linux 系統命令,這些命令是寫在bash原始碼的builtins裡面的,並由 shell 程式識別並在 shell 程式內部完成執行,通常在 linux 系統載入執行時 shell 就被載入並駐留在系統記憶體中。而且解析內部...

驅動框架6 linux核心的gpiolib學習

1 主線一 gpiolib的建立過程 2 主線二 gpiolib的使用方法 申請 使用 釋放 3 主線三 gpiolib的架構 涉及哪些目錄的哪些檔案 1 以一條主線進去,堅持主線 2 中途遇到雜碎知識,徹底搞定之,然後繼續主線 3 隨時做筆記以加深理解和記憶 4 學習途中注意架構思想,提公升自己大...