1 . 實驗環境爲 Centos-6.0 + 32位,使用的內核源碼爲 linux-3.1-rc4.tar.gz.
需要增加的系統調用函數爲:
int mycall(int num)
{
printk("This is my syscall from kernel.\n");
printk("current pid is: %d.\n", current->pid);
return num;
}
解壓內核源碼壓縮包,然後修改如下文件:
1) linux-3.1-rc4/arch/x86/kernel/syscall_table_32.S
在最後添加:
.long sys_mycall
2) linux-3.1-rc4/arch/x86/include/asm/unistd_32.h
可以看到原有的最後一個系統調用爲:
#define __NR_syncfs 344
在後面添加自己的系統調用:
#define __NR_mycall 345
同時,修改總的系統調用數:
#define NR_syscalls 346
3)linux-3.1-rc4/include/linux/syscalls.h
添加增加的系統調用的聲明:
asmlinkage long sys_mycall(int num);
4) linux-3.1-rc4/kernel/sys.c
添加系統調用函數:
SYSCALL_DEFINE1(mycall, int, num)
{
printk("This is my syscall from kernel.\n");
printk("current pid is: %d.\n", current->pid);
return (long)num;
}
編譯模塊:
$ make
$ make modules
安裝模塊:
$ make modules_install
安裝內核:
$ make install
2 . 實驗環境爲 Centos-6.0 + 64位,使用的內核源碼爲 linux-3.1-rc4.tar.gz.
需要增加的系統調用函數爲:
int mycall(int num)
{
printk("This is my syscall from kernel.\n");
printk("current pid is: %d.\n", current->pid);
return num;
}
解壓內核源碼壓縮包,然後修改如下文件:
1) linux-3.1-rc4/arch/x86/include/asm/unistd_64.h
可以看到原有的最後一個系統調用爲:
#define __NR_getcpu 309
__SYSCALL(__NR_getcpu,sys_getcpu)
我們添加:
#define __NR_mycall 310
__SYSCALL(__NR_mycall,sys_mycall)
修改 #define NR_syscalls (__NR_syscall_max + 1)
爲: #define NR_syscalls (__NR_syscall_max + 2)
2) linux-3.1-rc4/include/linux/syscalls.h
添加增加的系統調用的聲明:
asmlinkage long sys_mycall(int num);
3) linux-3.1-rc4/kernel/sys.c
添加系統調用函數:
SYSCALL_DEFINE1(mycall, int, num)
{
printk("This is my syscall from kernel.\n");
printk("current pid is: %d.\n", current->pid);
return (long)num;
}
編譯模塊:
$ make modules
$ make
安裝模塊:
$ make modules_install
安裝內核:
$ make install
也可以linux-3.1-rc4/kernel 增加自己的目錄文件。