内核源码版本:linux2.6.39
添加系统调用的步骤如下:
1.编写系统调用函数
在(linux2.6.39/kernel/sys.c)源码文件下添加自定义的系统调用函数。
本次实例函数如下:
/*自定义系统调用
功能:向虚拟终端打印一句话;
*/
SYSCALL_DEFINE0(mysyscall_hello)
{
/*注意:此时使用了printk()的最高打印级别(“<0>”,或者用KERN_EMERG宏),这样才能再ttyn终端看到打印信息
* 但是在图形界面下的虚拟终端中无法看到printk()的打印信息,如果需要查看printk()
* 的所有信息,请使用cat /var/log/syslog | grep "关键字";进行查看。
*/
printk("<0>""<0>hello,this is a new syscall!\n");
printk(KERN_EMERG"KERN_EMERG hello,this is a new syscall!\n");
return 0;
}
2.注册系统调用号
在(linux2.6.39/arch/x86/include/unistd_32.h)头文件中注册系统调用号
实例代码:
#define __NR_mysyscall_hello 345
注意:在添加自定义的系统调用号时一定要记得修改缺省系统调用号)(NR_syscalls),此调用号应该永远为最大
#ifdef __KERNEL__
将
#define NR_syscalls 345
改为
#define NR_syscalls 347
3.填写系统调用表
在(linux2.6.39/arch/x86/kernel/syscalls_table_32.S),
在syscall_table(系统调用表)中的相应位置填写系统调用函数(例如本次我写的系统调用(调用号最大),对应添加系统调用函数到syscall_table的最后一项)。
实例代码:
ENTRY(sys_call_table)
.long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
.long sys_exit
.......(中间省略)
.long sys_syncfs
.long sys_mysyscall_hello //本次添加的系统调用函数
4. 重新编译和安转内核
5.重启计算机,引导进入新的内核,编写测试函数。进入终端(tty(1~6))进行测试
测试代码如写:
/*文件名:test.c*/
#include
#include
int errno;
int main(int argc, char *argv[])
{
long x;
x = syscall(345); //系统调用
printf("yes, success! it's %ld\n", x);
return 0;
}
在终端中进入测试代码的当前目录(本次用root用户登录)
WDP~#gcc -o test test.c
WDP~#./test
将会再终端中看到:
"<0>hello,this is a new syscall!\n"
"KERN_EMERG hello,this is a new syscall!\n"
"yes, success! it's 0"
测试成功;
阅读(2708) | 评论(0) | 转发(0) |