Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63353
  • 博文数量: 16
  • 博客积分: 305
  • 博客等级: 二等列兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-30 10:18
文章分类

全部博文(16)

文章存档

2013年(1)

2012年(15)

我的朋友

分类: LINUX

2012-05-31 10:36:00

内核源码版本: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) |
给主人留下些什么吧!~~