1. 程式人生 > >作業系統實驗——增加系統呼叫(詳細圖文解釋)

作業系統實驗——增加系統呼叫(詳細圖文解釋)

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.執行截圖