arm-linux3.0自定义系统调用

作者:杜云鹤 2015.11

编译环境

硬件:讯为4412核心板,
OS:讯为linux3.0.15
编译环境:ubuntu1404
编译器:讯为提供的arm-2009q3-gcc交叉编译。
参考http://blog.chinaunix.net/uid-24782829-id-3211009.html一文。

实验目的

增加加减乘除等系统调用,并测试系统调用和用户调用的性能差异。

实验步骤

1、添加系统调用函数
在/kernel/sys.c内添加

/**
 * sys_add - self-define add
 * @ x, y
 * This is a user-added test 
 */
asmlinkage int sys_add(int x, int y)
{
    return x + y;
}

2、系统调用表内增加条目
/arch/arm/kernel/calls.S内添加

CALL(sys_add)

并且记录下调用号376
3、编译内核
4、测试

#include<asm/unistd.h>
#include<errno.h>
#include<stdio.h>

#define __NR_add 376
#define __NR_xor 377

int main()
{
    int a = syscall(__NR_add, 16, 24);
    int b = syscall(__NR_xor, 16, 24);
    printf("16+24=%d 16^24=%d\n", a, b);
    return 0;
}

在板子上显示
16+24=40 16^24=8
5、性能测试
编写usrtest.c

#include<errno.h>
#include<stdio.h>

int add(int a, int b)
{
    return a + b;
}

int main()
{
    int i, a;
    for(i = 0; i < 100000000; ++ i)
    {
        a = add(16, 24);
    }
    return 0;
}

与systest.c

#include<asm/unistd.h>
#include<errno.h>
#include<stdio.h>

#define __NR_add 376
#define __NR_xor 377

int main()
{
    int i, a;
    for(i = 0; i < 100000000; ++ i)
    {
        a = syscall(__NR_add, 16, 24);
    }
    return 0;
}

结果是预料当中的啦:

[root@iTOP-4412]# time systest
real 0m 16.49s
user 0m 5.40s
sys 0m 11.08s

[root@iTOP-4412]# time usrtest
real 0m 2.34s
user 0m 2.33s
sys 0m 0.01s

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值