• Linux实验四报告


    张文俊 + 原创作品转载请注明出处+ 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    一、学习内容

    系统调用:操作系统为用户态进程与硬件设备进行交互提供了一组接口

    API:应用编程接口,是一个函数定义。

    操作系统提供API和系统调用的关系。

    Libc库定义的一些API引用封装例程(wrapper routine)。一般每个系统调用对应一个封装例程。库再用这些封装例程定义给用户的API。

     

    返回值:

    1、大部分封装例程返回一个整数,值含义依赖于相应的系统调用;

    2、-1,多数情况——内核不满足进程请求。

    3、Libc定义errno变量包含特定出错码。

    二、实验部分:两种方式调用系统调用

    用户态进程——(调用)——>系统调用

    CPU——(切换)———内态核执行一个内核函数

    linux中,通过执行int $0x80执行系统调用的,此汇编指令产生向量为128的编程异常。

    中断向量0x80与system_call绑定起来,系统调用号将xyz和sys_xyz关联起来。

    系统调用三层皮:

    API XYZ

    中断向量system_call

    中断服务程序sys_xyz

    其中,system_call是Linux所有系统调用的入口点。

     

    <span style="text-decoration: underline;"><strong>传参</strong></span>:

    1、内核实现不同系统调用。

    2、进程必须指明哪个系统调用,这需要传递一个名为系统调用号的参数。使用EAX寄存器传递 3.ebx,ecx,edx,esi,edi按照顺序存放前五个参数。

    4、需要六个或六个以上参数时,应用一个单独的寄存器存放指向所有参数在用户空间地址的指针。

    5、返回值用eax。

    寄存器传递参数限制

    1、参数长度小于或等于寄存器长度(32位);

    2、除系统调用号(EAX),参数个数不超6个( EBX,ECX,EDX,ESI,EDI,EBP)

     

    关于实验,首先分析库函数调用系统调用的工作过程

     

    getpid()函数功能:

    取得进程识别码,返回值是进程的ID 这里直接使用getpid库函数进行系统调用。

    传入的参数为NULL,通过EAX传入,再通过EAX将返回值传回。

    其次,分析汇编代码调用系统调用的工作过程

     

    系统调用传递第一个参数ebx,这里是null

    8行,将ebx清零; 9行,将20放入EAX 11行,返回值用EAX存储

    总之,int 80触发中断,找到中断向量表,从表中寻找中断向量(或中断门),通过中断向量,找到系统调用表,

    找到system_call JMP EAX*4+system_table

    最后,对两者的编译结果进行分析:两种方式的编译运行结果分别是2999和3065。

    三、总结部分

    系统调用工作机制,就是应用程序应该以某种方式(库函数或汇编代码)通知系统,告诉内核自己需要执行一个系统调用,希望系统切换到内核态。

    内核就可以代表应用程序在内核空间执行系统调用。

    此外,通知内核的机制是靠软中断实现的: 通过引发异常将系统切换内核态执行异常处理程序(系统调用处理程序)。

     

  • 相关阅读:
    spring boot整合使用mybatis
    spring boot整合使用jdbcTemplate
    spring boot全局捕获异常
    springboot 静态资源访问
    spring boot项目的启动方式
    第一个spring boot项目 springboot-helloworld
    ASP.Net MVC 登录授权验证
    C# mysql 事务处理
    无法删除数据库,因为该数据库当前正在使用"问题解决
    mysql 按照小时去除一段时间内的不同状态数据统计
  • 原文地址:https://www.cnblogs.com/20135121conan/p/5297204.html
Copyright © 2020-2023  润新知