在linux2.6.39源码中添加一个简单的系统调用

内核源码版本: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 <unistd.h>
#include <stdio.h>
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"

测试成功;


from:http://blog.chinaunix.net/uid-26931176-id-3229428.html

你可能感兴趣的:(linux,系统调用)