Linux添加自定義系統(tǒng)調(diào)用
一、源碼修改
1下載一個(gè)與所用系統(tǒng)內(nèi)核版本接近的內(nèi)核,放在/usr/src下,解壓,作個(gè)鏈接ln -s linux-2.6.18.1 linux
2修改:修改三個(gè)地方
1)/usr/src/linux/kerner/sys.c中添加,
asmlinkage int sys_mysyscall(int a)
{
return a;
}
2)定義系統(tǒng)調(diào)用號(hào),/usr/src/linux/include/asm-i386/unistd.h
#define _NR_sysmycall 318 //不能與前面已有的重復(fù)
#define _NR_syscalls 319//修改系統(tǒng)中所用系統(tǒng)調(diào)用數(shù)目
3)在系統(tǒng)調(diào)用向量表里添加自定義的系統(tǒng)調(diào)用函數(shù)入口位置,
/usr/src/linux/arch/i386/kernel/syscall_table.S,以前老版本是entry.s
.long sys_mysyscall
二、內(nèi)核編譯
1.在/boot下復(fù)制配置文件,到/usr/src/linux下,改名位config,make menuconfig,可以不用修改,直接退出
2.make clean 清空以前的編譯痕跡
3.make,編譯出來的是bzImage
4.make modules,make modules-install//編譯、安裝config里配置的模塊
如不執(zhí)行次步驟,對于有的系統(tǒng),制作不了initrd文件。系統(tǒng)就啟動(dòng)不了
5.如果直接make install,系統(tǒng)會(huì)自動(dòng)制作initrd文件,并復(fù)制initrd和bzimage文件到/boot下,修改grub.conf文件,重啟系統(tǒng),選擇進(jìn)入新內(nèi)核
6.不使用make install命令。復(fù)制bzImage到/boot下,改名位vmlinuz-2.6.18.1,手工制作initrd文件,/mkinitrd initrd-2.6.18.1.img 2.6.18.1,initrd文件名位initrd-2.6.18.1
7.修改grub.conf文件,復(fù)制原來已有的啟動(dòng)設(shè)置,把title和kernel和initrd改名為新制作的即可
三、編寫代碼測試
int main(void)
{
int a=syscall(318,100);//318是系統(tǒng)調(diào)用號(hào),100是參數(shù)
printf("%d\n",a);
return 0;
}
syscall是內(nèi)核提供為用戶程序的一個(gè)函數(shù),
如果不使用syscall函數(shù),也可以使用宏定義,但是在2.6.20以后的版本里,沒有宏定義,需要自己從其他版本里復(fù)制過來添加。