日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

如何在Linux系統(tǒng)中添加新的系統(tǒng)調(diào)用( 二 )



asmlinkage int sys_mycall(int number);
{;
return number
}
作為一個(gè)最簡(jiǎn)單的例子,我們新加的系統(tǒng)調(diào)用僅僅返回一個(gè)整型值 。
(2) 連接新的系統(tǒng)調(diào)用
添加新的系統(tǒng)調(diào)用后,下一個(gè)任務(wù)是使Linux內(nèi)核的其余部分知道該程序的存在 。為了從已有的內(nèi)核程序中增加到新的函數(shù)的連接,需要編輯兩個(gè)文件 。
在我們所用的Linux內(nèi)核版本(RedHat 6.0,內(nèi)核為2.2.5-15)中,第一個(gè)要修改的文件是:

/usr/src/linux/include/asm-i386/unistd.h
該文件中包含了系統(tǒng)調(diào)用清單,用來給每個(gè)系統(tǒng)調(diào)用分配一個(gè)唯一的號(hào)碼 。文件中每一行的格式如下:

#define __NR_name NNN
其中,name用系統(tǒng)調(diào)用名稱代替,而NNN則是該系統(tǒng)調(diào)用對(duì)應(yīng)的號(hào)碼 。應(yīng)該將新的系統(tǒng)調(diào)用名稱加到清單的最后,并給它分配號(hào)碼序列中下一個(gè)可用的系統(tǒng)調(diào)用號(hào) 。我們的系統(tǒng)調(diào)用如下:

#define __NR_mycall 191
系統(tǒng)調(diào)用號(hào)為191,之所以系統(tǒng)調(diào)用號(hào)是191,是因?yàn)長(zhǎng)inux-2.2內(nèi)核自身的系統(tǒng)調(diào)用號(hào)碼已經(jīng)用到190 。
第二個(gè)要修改的文件是:
/usr/src/linux/arch/i386/kernel/entry.S

該文件中有類似如下的清單:

.long SYMBOL_NAME()
該清單用來對(duì)sys_call_table[]數(shù)組進(jìn)行初始化 。該數(shù)組包含指向內(nèi)核中每個(gè)系統(tǒng)調(diào)用的指針 。這樣就在數(shù)組中增加了新的內(nèi)核函數(shù)的指針 。我們?cè)谇鍐巫詈筇砑右恍校?br />
.long SYMBOL_NAME(sys_mycall)
(3) 重建新的Linux內(nèi)核
為使新的系統(tǒng)調(diào)用生效,需要重建Linux的內(nèi)核 。這需要以超級(jí)用戶身份登錄 。

#pwd;
/usr/src/linux;
#
超級(jí)用戶在當(dāng)前工作目錄(/usr/src/linux)下,才可以重建內(nèi)核 。

#make config;
#make dep;
#make clearn;
#make bzImage
編譯完畢后,系統(tǒng)生成一可用于安裝的、壓縮的內(nèi)核映象文件:

/usr/src/linux/arch/i386/boot/bzImage
(4) 用新的內(nèi)核啟動(dòng)系統(tǒng)
要使用新的系統(tǒng)調(diào)用,需要用重建的新內(nèi)核重新引導(dǎo)系統(tǒng) 。為此,需要修改/etc/lilo.conf文件,在我們的系統(tǒng)中,該文件內(nèi)容如下:

boot=/dev/hda;
map=/boot/map;
install=/boot/boot.b;
prompt;
timeout=50;
image=/boot/vmlinuz-2.2.5-15;
label=linux;
root=/dev/hdb1;
 read-only;
other=/dev/hda1;
label=dos;
table=/dev/had
首先編輯該文件,添加新的引導(dǎo)內(nèi)核:

image=/boot/bzImage-new;
label=linux-new;
root=/dev/hdb1;
read-only
添加完畢,該文件內(nèi)容如下所示:

boot=/dev/hda;
map=/boot/map;
install=/boot/boot.b;
prompt;
timeout=50;
image=/boot/bzImage-new;
label=linux-new;
root=/dev/hdb1;
read-only;
image=/boot/vmlinuz-2.2.5-15;
label=linux;
root=/dev/hdb1;
read-only;
other=/dev/hda1;
label=dos;
table=/dev/hda
這樣,新的內(nèi)核映象bzImage-new成為缺省的引導(dǎo)內(nèi)核 。為了使用新的lilo.conf配置文件,還應(yīng)執(zhí)行下面的命令:

#cp /usr/src/linux/arch/i386/boot/zImage /boot/bzImage-new
其次配置lilo:
# /sbin/lilo
現(xiàn)在,當(dāng)重新引導(dǎo)系統(tǒng)時(shí),在boot:提示符后面有三種選擇:linux-new 、linux、dos,新內(nèi)核成為缺省的引導(dǎo)內(nèi)核 。
至此,新的Linux內(nèi)核已經(jīng)建立,新添加的系統(tǒng)調(diào)用已成為操作系統(tǒng)的一部分,重新啟動(dòng)Linux,用戶就可以在應(yīng)用程序中使用該系統(tǒng)調(diào)用了 。
(5)使用新的系統(tǒng)調(diào)用
在應(yīng)用程序中使用新添加的系統(tǒng)調(diào)用mycall 。同樣為實(shí)驗(yàn)?zāi)康模覀儗懥艘粋€(gè)簡(jiǎn)單的例子xtdy.c 。

/* xtdy.c */;
#include;
_syscall1(int,mycall,int,ret);
main();
{;
printf("%d n",mycall(100))
}
編譯該程序:

推薦閱讀