LINUX核心分析。6

2puT發表於2016-07-30


一、程式的描述

  1. 程式控制塊PCB——task_struct
    • 作業系統的三大管理功能
    • - 程式管理
    • - 記憶體管理
  • 檔案系統
    • PCB task_struct中包含
    • - 程式狀態
    • - 程式開啟的檔案
  • 程式優先順序資訊
    • struct task_struct資料結構很龐大
  1. Linux程式的狀態
    不同於作業系統(就緒、執行、阻塞)
  • TASK_RUNNING具體是就緒還是執行,要看系統當前的資源分配情況;
  • TASK_ZOMBIE也叫殭屍程式
    為了管理程式,核心必須對每個程式進行清晰的描述,程式描述符提供了核心所需瞭解的程式資訊。

    二,程式的建立

    1.程式的建立概覽及fork一個程式的原始碼
  1. 回顧:start_kernel建立了cpu_idle,也就是0號程式。而0號程式又建立了兩個執行緒,一個是kernel_init,也就是1號程式,這個程式最終啟動了使用者態;另一個是kthreadd。這就是“道生一,一生二”。0號程式是固定的程式碼;1號程式是通過複製0號程式PCB之後在此基礎上做修改得到的。
  2. 回顧:系統呼叫的程式建立過程
    fork程式碼
    1.#include 
    2.#include 
    3.#include 
    4.int main(int argc, char * argv[])
    5.{
    6.int pid;
    7./* fork another process /
    8.pid = fork();
    9.if (pid < 0)
    10.{
    11./
     error occurred /
    12.fprintf(stderr,"Fork Failed!");
    13.exit(-1);
    14.}
    15.else if (pid == 0) //pid == 0和下面的else都會被執行到(一個是在父程式中即pid ==0的情況,一個是在子程式中,即pid不等於0)
    16.{
    17./
     child process /
    18.printf("This is Child Process!\n");
    19.}
    20.else
    21.{
    22./
     parent process /
    23.printf("This is Parent Process!\n");
    24./
     parent will wait for the child to complete*/
    25.wait(NULL);
    26.printf("Child Complete!\n");
    27.}
    }
    建立新程式的框架
    fork,vfork,clone都可以建立新程式,他們都是通過呼叫do_fork來實現的。
    • dup_thread複製父程式的PCB

    • copy_process修改複製的PCB以適應子程式的特點,也就是子程式的初始化

    • 分配一個新的核心堆疊(用於存放子程式資料)
    • 核心堆疊的一部分也要從父程式中拷貝

  • • 根據拷貝的核心堆疊情況設定eip,esp暫存器的值
  1. 一個新建立的子程式,(當它獲得CPU之後)是從哪一行程式碼程式執行的?
    • 與之前寫過的my_kernel相比較,kernel中是可以指定新程式開始的位置(也就是通過eip暫存器指定程式碼行)。fork中也有相似的機制
    • 這就涉及子程式的核心堆疊資料狀態和task_struct中thread記錄的sp和ip的一致性問題,這是在哪裡設定的?copy_thread in copy_process
    • 1.childregs = current_pt_regs(); //複製核心堆疊,並不是全部,只是regs結構體(核心堆疊棧底的程式)
    • 2.childregs->ax = 0; //為什麼子程式的fork返回0,這裡就是原因!
    • 3.
    • 4.p->thread.sp = (unsigned long) childregs; //排程到子程式時的核心棧頂
    5.p->thread.ip = (unsigned long) ret_from_fork; //排程到子程式時的第一條指令地址,也就是說返回的就是子程式的空間了

    三,使用gdb除錯


四,總結

通過本次的實踐我瞭解到了關於程式的一些原理明白程式在核心的中建立的過程。

——轉載


相關文章