操作系統項目:向Linux內核添加一個系統調用


內容

  1. 向Linux增加一個系統調用
  2. 撰寫一個應用測試程序調用該系統調用
  3. 使用ptrace或類似的工具對該測試程序進行跟蹤調

 環境

1.vmware workstation 15.0.0

2.ubuntu-18.10-desktop

3.linux-4.18.14

 

步驟

一.准備環境

在終端操作:

sudo apt-get update  //更新系統源碼 

sudo apt-get install vim //安裝vim

sudo apt-get install libncurses5-dev libssl-dev  //下載依賴包

sudo apt-get install libelf-dev

sudo apt-get install build-essential openssl  

sudo apt-get install zlibc minizip  

sudo apt-get install libidn11-dev libidn11

sudo apt-get install flex bison

 二.構建新內核

 1.准備

  在www.kernel.org下載linux-4.18.14.tar.gz

    解壓

將在官網下好的內核直接拉到ubuntn里,然后將壓縮包用指令移到/usr/src目錄下(過程需要root權限)。

       sudo su                                            //獲取root

  sudo mv  壓縮包位置    /usr/src         //移動文件

     cd  /usr/src                                  //切換到該目錄下進行操作

      sudo tar -xvflinux-4.18.14.tar.gz     //解壓

 2.添加系統調用

先將目錄切換到解壓后的內核里操作

  1. sudo vim  kernel/sys.c   //添加自己的函數   

這里添加了sys_helloworld

 

          2.sudo vim arch/x86/include/asm/syscalls.h //添加聲明  

  

               3.sudo vimarch/x86/entry/syscalls/syscall_64.tbl  //添加調用號

 

3.刪除無用的文件

sudo make mrproper

sudo make clean

4.配置 

sudo make menuconfig  

此處直接save,exit即可,無需修改

 

5.編譯新內核並安裝

A.編譯    

sudo make -j2  //將處理機內核總數調整為4,會明顯加快編譯速度

 

(-j2為開啟雙線程編譯)

B.安裝

sudo make modules_install  

sudo make install

6.重啟

//reboot

三.測試  

先使用vim寫一個測試的cpp

 

 

之后gcc編譯(前提是apt-get install build-essential安裝gcc/g++/gdb/make 等基本編程工具。)

然后運行

 

demsg   查看進程信息

 

 

上圖最后一行說明系統調用添加成功。

 

四.使用ptrace或類似的工具對測試程序進行跟蹤調試:

 1.先用strace,可以查看程序的系統調用。

   A.

 

 

 

下圖中read0, 就是程序中a的輸入,這里我輸入19.

syscall_0x150則是測試程序中的系統調用,0x150 16進制轉化為10進制即為336,是我們剛剛添加的系統調用號。

write則為printf

 

 

    B.再用strace -c 可以查看測試程序的各類系統調用。如下圖。

 

 2.接下來用gdb調試。gdbptrace的基礎上得來,功能強大且簡便。

 

A.我們這里僅僅簡單的調試。  

 

輸入l可以查看程序源碼。

 

 

輸入r可以運行程序。

 

輸入b x,可以在x行前添加斷點。

 

 

加斷點后先r,再用c可以一步步執行,每次到斷點停止。

 

clear可以清除斷點

 

return前插入斷點,運行,輸入bt可以查看堆棧調用。

 

 

3.Gdb和strace還有很多功能,對測試程序進行調試。在此不再演示。

 

 

題外話:

其實這就是操作系統第一次的大作業,實驗報告我也差不多就這么寫了。

假如有WHU的同學們參考了這篇文章。。不要copy啊 XD

教訓:

1.在sudo vim arch/x86/include/asm/syscalls.h //聲明    的時候world打成了wrold。。(哭泣)浪費了2個小時 

2.網上多數教程是syscallID = ptrace(PTRACE_PEEKUSER, pid, ORIG_EAX*4, NULL);但是這是32位機的情況,若是64位,則改成syscallID = ptrace(PTRACE_PEEKUSER, pid, ORIG_RAX*8, NULL); (打開reg.h看一看)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM