zoukankan      html  css  js  c++  java
  • 2019-2020-1 20209329《Linux内核原理与分析》第五周作业

    系统调用的两种方式

    一、库函数API调用

    以系统函数rename为例,研究Linux系统的系统调用过程。
    编写一个简单的API调用系统函数rename的c程序

    #include <stdio.h>
    int main(){
          int ret;
          char *oldname = "hello.c";
          char *newname = "20209329_zbl";
          ret = rename(oldname, newname);
          if(ret == 0)      //rename函数调用成功将返回0
                printf("Renamed successfully
    ");
          else
                printf("Unable to rename the file
    ");
          return 0;
    }
    

    编译运行,可见该程序已经将当前目录下的hello.c重命名为20209329_zbl。
    接下来,通过c语言内嵌汇编的方式,深入了解系统函数的调用过程。

    二、内嵌汇编调用
    编写一个内嵌汇编的c语言程序,同样实现系统函数rename的调用。

    #include <stdio.h>
    int main(){
          int ret;
          char *oldname = "hello.c";
          char *newname = "20209329_zbl";
          asm volatile(
                            "movl %2,%%ecx
    	" //参数按顺序赋值给ebx,ecx
                            "movl %1,%%ebx
    	"
                            "movl $0x26,%%eax
    	"//实现将系统调用号38传递给eax
                            "int $0x80"          //触发系统调用
                            :"=a"(ret)
                            :"b"(oldname), "c"(newname)
                                                          );
          if(ret == 0)
                printf("Renamed successfully
    ");
          else
                printf("Unable to rename the file
    ");
          return 0;
    }
    

    注意在编译的时候要指定 -m32,另外将文件名还原为hello.c,执行程序。

    可见,通过内嵌汇编实现了与API调用同样的功能。

    三、总结

    以rename函数为例,系统调用的三层机制分别为rename(),system_call(通过int $0x80触发系统调用),sys_rename(通过系统调用号38指定系统调用)。
    系统函数的调用过程:从API函数,进入系统调用的封装,封装里的int指令会触发软中断,保存用户态的上下文,0x80对应中断服务程序的入口,通过系统调用号指定系统调用例程,执行例程,例程执行完毕后返回用户态。

  • 相关阅读:
    中阶 d04.1 xml解析
    中阶 d04 xml 概念及使用
    中阶 d03.5 (正篇)完整的Dao 操作数据库
    中阶d03.4 JDBC_DAO
    中阶d03.3 JDBC_CURD_Util --- 使用 junit执行单元测试(增删改查)
    单元测试 junit
    idle中上传jar包并使用的方法
    intelij idea 和 eclipse 使用上的区别
    中阶d03.2 JDBC联合properties使用,通过读取本地配置文件为代码传递参数
    swift init 初始化
  • 原文地址:https://www.cnblogs.com/Alannic/p/13939383.html
Copyright © 2011-2022 走看看