linux内核编程4部曲之二:增加linux内核系统调用

linux内核编程4部曲之一:linux内核编译(2.6.12版本)图文解说

linux内核编程4部曲之二:增加linux内核系统调用

linux内核编程4部曲之三:修改O(1)调度算法

linux内核编程4部曲之四:模块编程

 

 

本文,承接上面一篇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

  1. #include<asm/unistd.h>
  2. #include<errno.h>
  3. #include<stdio.h>

  4. #define __NR_add 289
  5. #define __NR_sub 290
  6. _syscall2(int ,add,int ,x,int,y)
  7. _syscall2(int ,sub,int ,x,int ,y)
  8. int main()
  9. {
  10.    printf("%d\n",add(10,10));
  11.    printf("%d\n",sub(15,10));
  12.    return 0;
  13. }
     编译运行,查看结果,成功调用。这里要注意的是,在testsyscall.c中声明__NR_add 289.
    
    2)、性能测试
    要对比系统调用和用户调用的性能差异,我们先编写用户调用的测试程序testusercall.c

  1. #include<stdio.h>
  2. int add(int x,int y)
  3. {
  4.    return x+y;
  5. }
  6. int main()
  7. {
  8.    int i=0;
  9.    for(i=0;i<100000000;i++)
  10.    {
  11.       add(10,20);
  12.    }
  13.    return 0;
  14. }
     再编写系统调用的测试程序testsyscall.c
  1. #include<asm/unistd.h>
  2. #include<stdio.h>

  3. #define __NR_add 289
  4. _syscall2(int ,add,int ,x,int,y)
  5. int main()
  6. {
  7.    int i=0;
  8.    for(i=0;i<100000000;i++)
  9.    {
  10.       add(10,20);
  11.    }
  12.    return 0;
  13. }
  两个程序均是运行10000000次,然后分别统计他们的时间。
  
   
   可以发现,两个测试程序在系统sys运行时间差别很大,testusercall仅在sys运行了0m0.003s,而testsyscall却在sys运行了0m4.028s,说明,系统调用的sys时间远远大于用户层调用的时间。
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核一直是学习的难点:将近3000万行代码,5万多个源文件,代码庞大繁杂、代码很难看懂。《Linux内核编程》将突破以往传统的学习方式,采取更有效和科学的学习方法,多角度地对内核进行多层次分析,不局限于形式,不拘泥细节,目的只有一个:更轻松、更高效地去理解内核、学习内核。为了更好地让学员掌握内核编程技能,更好地理解内核,本课程将采用并不局限于以下学习方法进行课程的录制:降维分析,化简为繁,将复杂的系统简单化用软件工程的方法分析内核:软件分层、模块化分解、框架迭代多角度立体分析Linux内核,目的只有一个:更好地理解内核利用Linux内核中的面向对象编程思想去分析复杂的子系统、子系统交互利用多任务编程的思想去分析Linux内核本套课程预计分为20个左右的小模块,每个模块一个专题,每个专题会陆续发布。拟录制的模块包括但不限于:模块机制、内核裁剪与配置、内核编译与启动、系统调用、中断、文件系统、调度、内存管理、内核同步、设备模型、字符驱动、块驱动、定时器、input、platform设备驱动、device tree、proc、sysfs、I/O...  本课程是《Linux内核编程》的入门篇,主要给大家介绍一下Linux内核开发、Linux驱动开发的就业行情、行业生态、需要掌握哪些技能、Linux内核的学习方法、如何搭建Linux内核的学习开发环境。 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值