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

你可能感兴趣的:(ubuntu)