linux内核编程4部曲之二:增加linux内核系统调用
2016-02-16 10:02
405 查看
本文,承接上面一篇linux内核编译,增加系统调用后,需要重新编译内核。
一、实验目的
增加加减乘除系统调用,并测试系统调用和用户调用的性能差异。
二、增加系统调用
增加系统调用主要分为3步:
1)、增加系统调用函数。修改/usr/src/linux-2.6.12/kernel/sys.c文件,在文件末尾增加4个系统响应函数(+、-、*、/)。函数实现如下:
2)、在系统调用表中注册。
在/usr/src/linux-2.6.12/arch/i386/kernel/syscall_table_32.S中添加我们的系统调用。
3)、添加系统调用入口参数
在/usr/src/linux-2.6.12/include/asm-i386/unistd.h中添加系统调用入口参数(注意:其中会顺序定义入口参数的序号,添加的序号是在原有最大值的基础上+1)。
三、编译内核,引导新内核启动
四、测试
测试需要在添加了系统调用的新系统中进行。
1)功能测试
首先测试,系统调用是否能正常执行,测试程序为testsyscall.c
#include<asm/unistd.h>
#include<errno.h>
#include<stdio.h>
#define __NR_add 289
#define __NR_sub 290
_syscall2(int ,add,int ,x,int,y)
_syscall2(int ,sub,int ,x,int ,y)
int main()
{
printf("%d\n",add(10,10));
printf("%d\n",sub(15,10));
return 0;
}
编译运行,查看结果,成功调用。这里要注意的是,在testsyscall.c中声明__NR_add 289.
2)、性能测试
要对比系统调用和用户调用的性能差异,我们先编写用户调用的测试程序testusercall.c
#include<stdio.h>
int add(int x,int y)
{
return x+y;
}
int main()
{
int i=0;
for(i=0;i<100000000;i++)
{
add(10,20);
}
return 0;
}
再编写系统调用的测试程序testsyscall.c
#include<asm/unistd.h>
#include<stdio.h>
#define __NR_add 289
_syscall2(int ,add,int ,x,int,y)
int main()
{
int i=0;
for(i=0;i<100000000;i++)
{
add(10,20);
}
return 0;
}
两个程序均是运行10000000次,然后分别统计他们的时间。
可以发现,两个测试程序在系统sys运行时间差别很大,testusercall仅在sys运行了0m0.003s,而testsyscall却在sys运行了0m4.028s,说明,系统调用的sys时间远远大于用户层调用的时间。
一、实验目的
增加加减乘除系统调用,并测试系统调用和用户调用的性能差异。
二、增加系统调用
增加系统调用主要分为3步:
1)、增加系统调用函数。修改/usr/src/linux-2.6.12/kernel/sys.c文件,在文件末尾增加4个系统响应函数(+、-、*、/)。函数实现如下:
2)、在系统调用表中注册。
在/usr/src/linux-2.6.12/arch/i386/kernel/syscall_table_32.S中添加我们的系统调用。
3)、添加系统调用入口参数
在/usr/src/linux-2.6.12/include/asm-i386/unistd.h中添加系统调用入口参数(注意:其中会顺序定义入口参数的序号,添加的序号是在原有最大值的基础上+1)。
三、编译内核,引导新内核启动
四、测试
测试需要在添加了系统调用的新系统中进行。
1)功能测试
首先测试,系统调用是否能正常执行,测试程序为testsyscall.c
#include<asm/unistd.h>
#include<errno.h>
#include<stdio.h>
#define __NR_add 289
#define __NR_sub 290
_syscall2(int ,add,int ,x,int,y)
_syscall2(int ,sub,int ,x,int ,y)
int main()
{
printf("%d\n",add(10,10));
printf("%d\n",sub(15,10));
return 0;
}
编译运行,查看结果,成功调用。这里要注意的是,在testsyscall.c中声明__NR_add 289.
2)、性能测试
要对比系统调用和用户调用的性能差异,我们先编写用户调用的测试程序testusercall.c
#include<stdio.h>
int add(int x,int y)
{
return x+y;
}
int main()
{
int i=0;
for(i=0;i<100000000;i++)
{
add(10,20);
}
return 0;
}
再编写系统调用的测试程序testsyscall.c
#include<asm/unistd.h>
#include<stdio.h>
#define __NR_add 289
_syscall2(int ,add,int ,x,int,y)
int main()
{
int i=0;
for(i=0;i<100000000;i++)
{
add(10,20);
}
return 0;
}
两个程序均是运行10000000次,然后分别统计他们的时间。
可以发现,两个测试程序在系统sys运行时间差别很大,testusercall仅在sys运行了0m0.003s,而testsyscall却在sys运行了0m4.028s,说明,系统调用的sys时间远远大于用户层调用的时间。
相关文章推荐
- linux内核编程4部曲之一:linux内核编译
- Linux服务器中木马(肉鸡)手工清除方法
- linux内核的编译
- linux mail 命令 (收发邮件)
- Linux平台Boost的编译方法
- 基于AT91SAM9X35EK的嵌入式Linux+UBI根文件系统移植成功
- Linux中强大的top命令
- linux进程的后台运行、查看、关闭等命令
- Linux 磁盘空间操作
- linux之sed命令
- linux常用命令
- ubuntu挂载新磁盘到指定目录
- Centos 安装fastcgi详解与用例
- win7下eclipse插件连接linux下hdfs单机伪集群 hadoop 2.6
- Linux常用命令
- linux学习一天一个命令(15)[tar命令]
- linux学习一天一个命令(13)[head命令]
- linux学习一天一个命令(12)[less命令]
- 扩大VMware虚拟机中CentOS 7的硬盘空间
- linux学习一天一个命令(11)[more命令]