內容:
- 向Linux增加一個系統調用
- 撰寫一個應用測試程序調用該系統調用
- 使用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.添加系統調用
先將目錄切換到解壓后的內核里操作
- 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.
下圖中read(0, 就是程序中a的輸入,這里我輸入19.
而syscall_0x150則是測試程序中的系統調用,0x150 16進制轉化為10進制即為336,是我們剛剛添加的系統調用號。
write則為printf。
B.再用strace -c 可以查看測試程序的各類系統調用。如下圖。
2.接下來用gdb調試。gdb在ptrace的基礎上得來,功能強大且簡便。
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看一看)