聊聊Linux核心建立新程序

2021-07-29 19:16:49 字數 2654 閱讀 3737

計算機是一種精密的儀器,有一點錯誤都是不能成功執行的,計算機軟體是靠乙個個程式組成的,而程式又是一系列指令所組成。通過執行這樣的一條條指令,計算機就能完成乙個個任務了。

這裡有兩個概念比較容易混淆,平時我們在學習計算機的時候也是這樣,那就是程序和程式的區別,這也是這篇部落格的主要內容,程序。簡單點講,程序就是程式的動態執行,是乙個執行起來的程式。

linux其中乙個重要的功能就是管理各種狀態的程序,包括建立程序、管理程序、排程程序等一系列操作,正是由於有這些操作,才發揮了系統強大的能力。首先我們一起來熟悉一下程序。一般來說,程序都要經歷3個狀態,分別是就緒態、阻塞態、執行態。但是linux作業系統將程序的狀態進行了進一步劃分,分為執行態、不可中斷阻塞狀態、可中斷阻塞狀態、掛起狀態、殭屍狀態5個狀態。它們的具體含義是:

執行狀態:當程序正在被cpu執行,或處於就緒狀態,則稱程序處於執行狀態。

可中斷睡眠狀態:程序處於阻塞狀態,系統不會排程其執行。

暫停狀態:程序收到有關訊號就會進入暫停狀態,可用sigcont進行喚醒

僵死狀態:程序停止執行

不可中斷睡眠狀態:使用wake_up()函式明確喚醒時才能轉換到可執行的就緒狀態。

圖1.程序的5種執行狀態

圖2.程序之間的轉換

有了這些基礎知識,然後我們就可以開始進行建立新程序的分析了。首先,我們接觸到乙個系統呼叫函式fork,呼叫這個函式的時候,系統將會從使用者態到核心態的切換。那麼在程式中呼叫系統呼叫fork需要經過哪些步驟呢?目前主要有這麼幾個步驟:

1.     呼叫fork這個系統呼叫,首先是軟中斷,堆疊切換到核心堆疊,儲存相應的暫存器,進行執行位址的跳轉。

2.     查詢相關的中斷向量表,找到中斷向量表中的函式名稱,這裡fork對應的函式名稱是sys_clone函式。

3.     執行sys_clone,這個函式不是直接執行,而是都會執行乙個do_fork函式,產生乙個新的的程序。

下面是do_fork()的解釋

do_fork()

retval=copy_thread(p) //設定新程序的起始位址,新程序的核心堆疊 }}

下面是copy_thread()的**解釋

copy_thread()              

p->thread.ip=ret_from_fork //入口位址

p->thread.sp=childregs //將新程序的核心堆疊指向

childregs=current_pt_regs //拷貝父程序核心堆疊資料

childregs->sp=sp; //將拷貝的sp設定為傳入的sp

此時子程序的核心堆疊如下:

stack(ti),childregs           :  current_pt_regs   複製

ax=0; 修改ax

sp=sp; 修改sp

最後再進行一下跳轉,並將所有子程序壓入棧中的資料進行彈出,這樣子程序的所有資料都有了,就可以自己執行了。

說了這麼多理論,下面來開始我們的實驗,進行一下驗證。

圖3.首先在test.c檔案中寫入fork函式

圖4.匯入相應的執行命令

圖5.編譯執行

圖6.編譯執行完的結果,證明新程序已經建立

圖7.除錯模式啟動

圖8.在相應的執行行上列印上斷點,主要針對fork功能打斷點

圖9.除錯過程中

總結:fork建立子程序也是一種特殊的系統呼叫,在執行這個系統呼叫之前,要進行保護現場操作,也就是要對有關暫存器的值進行儲存,當新程序建立完成以後可以回到此處繼續執行。在保護好現場以後,就是查詢sys_call_table裡面的有關資訊,這樣就能根據呼叫號來找到相應的入口位址。再通過函式入口位址來進行處理,處理過程也是拷貝父程序的有關資訊,然後加上自己獨特的資訊,這就構成新的程序,這也是fork的整個工作流程。

Linux建立新程序

在linux系統中,建立新程序涉及到兩個系統呼叫api 分別是fork 和exec 首先,在當前程序中,呼叫fork 複製出自身的乙個拷貝,此時主要涉及到核心中與程序上下文相關的資料複製操作,而使用者 和資料則採用寫時複製技術共享同乙份資源。當乙個程序複製後,原程序稱為父程序,新程序則稱為子程序.然...

Linux基礎 建立新程序

好久沒學習了,最近都在忙著上班的事情,過年後這段時間感覺每天都有事情做,忙忙忙,學linux感覺說實話,有點枯燥,比當初學fpga還要枯燥。真的是畢業之後,再去學習的動力就下降很多嗎。但是還是要堅持啊。程式並不能單獨執行,只有將程式載入到記憶體中,系統為他分配資源後才能夠執行,這種執行著的程式稱之為...

linux建立新程序的過程

linux系統中建立新程序使用fork 系統呼叫。所有程序都是通過複製程序0而得到的。都是程序0的子程序。linux建立新程序的過程 1.系統首先在任務陣列中找出乙個還沒有被任何程序使用的空項。如果陣列已滿,沒有空項,則fork系統呼叫出錯返回。系統將會為新建程序在記憶體區中分配一頁記憶體來存放其任...