今天學習了linux的程序建立的基本原理,是基於0.11版本核心的。下面對其作一下簡單的總結。
一、linux程序在記憶體中的相關資源
很容易理解,linux程序的建立過程就是記憶體中程序相關資源產生的過程,那麼linux程序在記憶體中有哪些相關資源呢?
1)task陣列中的一項:乙個指標指向程序的task_struct
2)一頁記憶體:task_struct(linux程序控制塊)和核心態堆疊
3)頁表:線型位址到實體地址的對映表
4)頁目錄表項:指向頁表
5)全域性描述表(gdt)中的兩項:一項指向任務狀態段(tss,在task_struct中),一項指向該程序的區域性描述符表
(ldt,在task_struct中)
6)**段、堆、棧、引數全域性變數等資料區
二、程序控制塊-task_struct
上面提到的這幾類資源中,很多都與task_struct有關,所以我想說一下task_struct。它是linux的程序控制塊,駐留在記憶體中,描述程序的基本資訊,所以它是程序操作依據的資料結構,
在程序中
占有重要地位。下面列出在0.11版本中主要幾類資訊,對它應該就有了基本的了解。
1)標識號:程序標識、使用者標識、組標識。
2) 訊號
3)狀態: linux的程序的四種基本狀態
4)排程資訊:優先順序、時間片、執行時間等
5)程序鏈資訊:父程序、子程序的指標
6)檔案資訊:開啟檔案、當前目錄
7)區域性描述符表(ldt):**段、資料段、堆疊段的描述符
8)任務狀態段(tss):cpu相關暫存器的內容
三、任務狀態段-tss
在上述的task_struct中有乙個結構:任務狀態段(tss)。我們知道,計算機執行乙個程式的時候的直接依據就是cpu的
各個暫存器,tss就是描述程序執行時候cpu的狀態資訊,當cpu進行程序切換的時候,會自動將這些資訊更新到到鄉音寄存
的。下面就讓我們一起了解一下0.11核心中fork()的大體工作過程:
1)在記憶體中申請一頁記憶體存放程序控制塊task_struct,並返回程序號nr,並在task陣列的nr處存放task_struct的指
針,還要將task的當前指標current指到nr處;
2)將父程序的task_struct的內容複製到新程序的task_struct中作為模版
3)對task_struct中的資訊進行修改,主要進行一下工作:設定父程序、清除訊號位圖、時間片、執行時間、根據當
task_struct中區域性描述符表中的**段和資料段描述符。
5)複製父程序的頁表目錄項和頁表:在頁目錄表中,複製父程序的頁表目錄項,目的位址由新程序的線性位址計算出
來;對每個對應的頁表目錄項申請乙個空閒頁,並用頁表位址更新頁表目錄項,最後將父程序頁表中各項複製到新程序對
應的頁表中,也就是說,這個時候,子程序與父程序共享物理記憶體。
6)更新task_struct中的檔案資訊:檔案開啟次數加1,父程序的當前目錄引用數加1。
7)設定tss和ldt描述符項:在全域性描述符表(gdt)中設定新任務的tss描述符項和ldt段的描述符項,使tss描述符項
和ldt描述符項分別指向task_struct的tss結構和ldt結構。
8)將任務設定為就緒狀態,向當前程序(父程序)返回新程序號。
五、結束語
可以看出,fork()中,核心並不立刻為新程序分配**和資料物理記憶體頁,新程序與父程序共同使用父程序已有的代
碼和資料物理記憶體頁面。只有當以後執行過程中由乙個程序一寫方式訪問記憶體時候被訪問的記憶體頁面才會在寫操作之前被
複製到新申請的記憶體頁面中。
另外在fork的最後是將任務設定成了就緒狀態,由於fork()是乙個系統呼叫,在系統呼叫部分system_call.s,可以看到在系統函式返回後,會呼叫排程函式schedule(),在schedule()中,就會檢測到新程序的就緒狀態,並用switch_to()切換到新程序進行執行。
Linux 程序建立 程序終止
程序終止 fork 在linux中fork函式時非常重要的函式,它從已存在程序中建立乙個新程序。新程序為子程序,而原程序為父程序。include pid t fork void 返回值 自程序中返回0,父程序返回子程序id,出錯返回 1子程序複製父程序的pcb,因此複製了父程序的程式計數器,所以和父...
Linux 程序建立
華清遠見嵌入式學院 上海分中心講師。在 linux 核心內,程序是由相當大的乙個稱為 task struct 的結構表示的。此結構包含所有表示此程序所必需的資料,此外,還包含了大量的其他資料用來統計 accounting 和維護與其他程序的關係 父和子 下面給出了 task struct 的一小部分...
Linux 程序建立
1 linux建立程序的方式是先通過呼叫fork建立乙個和呼叫程序基本一樣的子程序,二者之間的區別在於pid和ppid不同。然後子程序呼叫exec函式裝載乙個新的程序到位址空間執行。其他的作業系統產生子程序的方式是spawn 在新的位址空間中建立程序,然後載入可執行檔案執行。2 傳統的fork是將所...