zoukankan      html  css  js  c++  java
  • 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。

    三、总结部分

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

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

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

     

  • 相关阅读:
    LeetCode Single Number
    Leetcode Populating Next Right Pointers in Each Node
    LeetCode Permutations
    Leetcode Sum Root to Leaf Numbers
    LeetCode Candy
    LeetCode Sort List
    LeetCode Remove Duplicates from Sorted List II
    LeetCode Remove Duplicates from Sorted List
    spring MVC HandlerInterceptorAdapter
    yum
  • 原文地址:https://www.cnblogs.com/20135121conan/p/5297204.html
Copyright © 2011-2022 走看看