作者:杜云鹤 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