linux 2.6 添加系统调用,在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 #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"

测试成功;

阅读(2034) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值