1. 程式人生 > >linux下增加一個新的系統呼叫實現pstree功能

linux下增加一個新的系統呼叫實現pstree功能

這是我們linux課程的一個作業。
首先得到init程序的task_struct,根據list_for_each可以迴圈遍歷可以的到其所有的子程序的 list_head,根據list_head使用list_entry可以得到其task_struct,在迴圈的同時,每得到一個程序的task_struct,就遞迴遍歷其子程序的task_struct。在遞迴的同時,記錄遞迴的深度,根據深度在每個子程序的pid前面加上相應多少的製表符,從而反應程序之間的父子關係。
程式碼:

int processtree(struct task_struct *p,int b)
 {   
    int dep=0
; //記錄遞迴深度,根據深度決定在列印時候時程序pid前面新增幾個製表符 struct list_head *head; for(l=p->children.next;l!=&(p->children);l=l->next)//對父程序迴圈遍歷其子程序 { struct task_struct *t=list_entry(l,struct task_struct,sibling);//根據task_struct中list_head得到其task_struct結構體 while(dep!=0) { printk("\t | %d"
,dep); //對於每個遍歷到的程序,根據深度在其前邊新增製表符 } printk("---%d\n",p->pid); //列印遍歷到的當前程序,並打印出pid dep+=(processtree(t,b+1)+1); //對於遍歷到的子程序,進行遞迴遍歷他的子程序,同時遍歷的深度加深 } return dep; }

實現方式:
根據所學知識,我們知道在核心中新增系統呼叫主要是修改系統呼叫表和實現系統呼叫函式,為此我下載了4.9版本的linux原始碼,在linux-4.9.9/Documentation/下找到了adding-sys.txt這個增加系統呼叫的說明文件,找到關鍵部分如圖
這裡寫圖片描述


對於x86平臺,有個特別的說明:
這裡寫圖片描述
在系統呼叫表下增加新的系統呼叫:
這裡寫圖片描述
其中系統呼叫號是332.
更新kernel/sys_ni.c檔案
這裡寫圖片描述
最後在kernel/sys.c檔案中實現新增加的函式:

int processtree(struct task_struct *p,int b)
 {   
    int dep=0;   //記錄遞迴深度,根據深度決定在列印時候時程序pid前面新增幾個製表符
    struct list_head *head;  
      for(l=p->children.next;l!=&(p->children);l=l->next)//對父程序迴圈遍歷其子程序
    {     
        struct task_struct *t=list_entry(l,struct task_struct,sibling);//根據task_struct中list_head得到其task_struct結構體
        while(dep!=0)
        {
            printk("\t | %d",dep);        //對於每個遍歷到的程序,根據深度在其前邊新增製表符
        }
        printk("---%d\n",p->pid);          //列印遍歷到的當前程序,並打印出pid
        dep+=(processtree(t,b+1)+1);      //對於遍歷到的子程序,進行遞迴遍歷他的子程序,同時遍歷的深度加深
           }
    return dep;
    }

makefile檔案:
這裡寫圖片描述

核心的編譯:
首先下載linux原始碼,進入其目錄
第一次編譯由於沒有安裝ncurses庫,會報錯
安裝ncurses
sudo apt-get install libncurses5-dev
生成核心配置檔案
make menuconfig
如果是不是第一次配置,先執行make mrproper清除之前的配置,然後重新執行make menuconfig

這裡寫圖片描述
這裡寫圖片描述
直接選擇退出,然後進行核心編譯
make -j16
編譯完成後,安裝模組
make modules_install
make install
完成後重啟
reboot

安裝核心模組:
編譯完成後,安裝核心模組:
insmod file_name.ko
解除安裝核心模組:
rmmod file_name.ko

編寫測試程式碼:
這裡寫圖片描述

執行截圖:
這裡寫圖片描述
這裡寫圖片描述