作業系統實驗——增加系統呼叫(詳細圖文解釋)
阿新 • • 發佈:2019-01-04
Linux新增系統呼叫
注意:請提前安裝好Vmware,並準備好Ubuntu映象檔案以及Linux核心(我用的是Ubuntu10.0.4版本,核心版本是Linux-2.6.32.65.xz)
操作步驟:
1.點選建立一個新的虛擬機器
1)選擇自定義,點選下一步,接下來選擇預設配置,進入虛擬機器嚮導
2)選擇一個映像檔案
3)根據你自己的資訊設定這些資訊
4)選擇一個磁碟安裝虛擬機器
5)根據你電腦配置選擇處理器核心
6)剩下幾步都可以預設,直到這裡要選擇IDE
7)一直預設到這裡點完成,下面只要靜靜地進行等待就可以了
8)到這裡說明你的虛擬機器已經建立完成,輸入密碼即可進入linux桌面
2.安裝編譯核心時需要的工具
首先用快捷鍵ctrl+alt+T開啟終端,使用 sudo su指令和密碼獲得root許可權,再輸入:
apt-get install build-essential kernel-package libncurses5-dev
//build-essential (基本的程式設計庫(gcc, make等)
//kernel-package (Debian 系統裡生成 kernel-image 的一些配置檔案和工具)
//libncurses5-dev (meke menuconfig要呼叫的)
輸入Y,開始下載(根據網速可能會有點慢)因為我這裡已經 安裝好了,所以是這種介面
3.將核心程式碼解壓並移入/usr/src目錄
首先直接將下載好的linux核心直接拖到虛擬機器桌面上,進行解壓並將解壓後文件移到/usr/src目錄中
cd Desktop //進入桌面 //tar jxvf linux-2.6.32.65.tar.bz2 //解壓.bz2檔案 xz -d linux-2.6.32.65.tar.xz tar xvf linux-2.6.32.65.tar //解壓.xz檔案 cp -r linux-2.6.32.65 /usr/src //檔案拷到/usr/src目錄中
這樣,核心就移到/usr/src了
4.新增系統呼叫
gedit /usr/src/linux-2.6.32.65/kernel/sys.c //開啟系統呼叫檔案,向最後一行新增: asmlinkage int sys_mycall(int number) { printk("xxxx");//注意“”中可以輸入個人資訊或者是“hello world” return number; } gedit /usr/src/linux-2.6.32.65/arch/x86/kernel/syscall_table_32.S //將223行.long sys_ni_syscall改為.long sys_mycall gedit /usr/src/ linux-2.6.32.65/arch/x86/include/asm/unistd_32.h //增加一行,對應上面的223:#define__NR_mycall 223
注意:如果上述三個檔案開啟時是空白,請檢查路徑名是否正確,另外高版本的核心這些檔名可能產生改變,請對應修改5.配置核心
cp/boot/config-2.6.32-21-generic /usr/src/linux-2.6.32.65/.config
//把正在使用中的核心配置檔案拷到/usr/src/linux-2.6.32.65/.config目錄下,<span style="color:#FF0000;">注意2.6.32-21-generic是我的Ubuntu版本下的配置檔案,需要根據自己的版本進行修改</span>
cd /usr/src/linux-2.6.32.65
make menuconfig //注意:這個命令需要將終端視窗最大化,否則會報錯
//終端會彈出一個配置介面
//注意主選單最後有兩項:load a kernel configuration...
//save a kernel configuration...
//先選第一項load ....意思是,利用當前的核心配置詳單來設定將要編譯的核心,然後選save這一項儲存,最後退出配置介面。
make -j2 //核心配置,比較耗時間
make install
make modules //編譯模組
make modules_install //安裝模組
mkinitramfs -o /boot/initrd.img-2.6.32.65 //最後建立initrd檔案
update-grub //更新配置檔案
reboot //重啟,<span style="color:#FF0000;">出錯資訊請忽略</span>
uname –r //即可看到版本號已經發生變化
6.編寫測試程式
cd Desktop
gedit test.c //用記事本編寫一個c程式
#include <linux/unistd.h>
#include <sys/syscall.h>
int main()
{
syscall(223);
}
//編譯執行
gcc -o test test.c
./test
dmesg //檢視程序資訊
7.執行截圖