linux实现新的系统调用

平台:mini2440

kernel;2.6.32.2\

一.添加系统调用代码

 vim arch/arm/kernel/sys_arm.c

sys_arm.c包含了非标准的系统调用

下面是创建一个名为mycall(int number)函数

asmlinkage int sys_mycall (int number)

{

return number;

}

二.连接新的系统调用

添加完新的系统调用后,下一个任务是使内核的其他部门代码知道该新的系统调用函数的存在。编辑两个文件,它们是unistd.h 和calls.S 

unistd.h 全路径为 arch/arm/include/asm/unistd.h

该文件包含了系统的调用清单,用来给没一个系统调用分配一个唯一的号码,文件中的每一行格式如下

#define _NR_NAME  (_NR_SYSCALL_BASE+NNN)

其中name用系统调用的名字代替,而NNN这是该系统调用对应的号码。

比如将刚才那个加入里面

#define _NR_mycall  (_NR_SYSCALL_BASE+365)

这里的365为可用的系统调用号就行

calls.S路径arch/arm/kernel/calls.S该文件最后会被include进entry-common.S

该文件中有类似如下的清单

CALL (NAME)


我在最后添加

CALL (sys_mycall)

重新编译linux内核,在应用程序中便可以进行调用了

编译中出现问题

arch/arm/kernel/built-in.o: In function `__sys_trace_return':
io.c:(.text+0xddc): undefined reference to `mycall'
arch/arm/kernel/built-in.o: In function `sys_oabi_readahead':
io.c:(.text+0x1458): undefined reference to `mycall'
make: *** [.tmp_vmlinux1] Error 1


原来是CALL (sys_mycall)写成了CALL (mycall)

三.在应用程序中使用系统调用是通过如下函数

int syscall (int number,...);

地一个参数number代表系荣调用号,后面的参数列表则是根据实现的系统调用函数sys_mycall的参数来填写,返回值也和sys_mycall的返回值对应。


#include <stdio.h>
#include <unistd.h>
int main()
{
   int a;
   a=syscall(365,8);
   printf("a=%d",a);

return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值