zoukankan      html  css  js  c++  java
  • 操作系统-中断(3)系统调用

    系统调用:操作系统的程序接口
    操作系统实现的完成某种特定功能的过程;为所有运行程序提供访问操作系统的接口
    用户程序如何陷入操作系统,请求操作系统为其服务,需要一个硬件处理机制陷入处理机制:计算机系统中控制和实现系统调用的机制
    陷入指令:也称访管指令,或异常中断指令,计算机系统为实现系统调用而引起处理器中断的指令。每个系统调用都事先规定了编号,并在约定寄存器中规定了传递给内部处理程序的参数
    系统调用的实现要点:
    • 编写系统调用处理程序
    • 设计一张系统调用入口地址表,每个入口地址指向一个系统调用的处理程序,并包含系统调用自带参数的个数
    • 陷入处理机制需开辟现场保护区,以保存发生系统调用时的处理器现场
    Linux提供了几百种系统调用,主要分为以下几类:
    进程控制、文件操作、文件系统操作、系统控制、内存管理、网络管理 、用户管理、进程通信等
    系统调用号是系统调用跳转表索引值,跳转表给出系统调用服务例程首址
    通常,系统调用被封装成用户程序能直接调用的函数,如exit()、read()和open(),这些是标准C库中系统调用对应的封装函数 。
    Linux中系统调用所用参数通过寄存器传递,若参数个数超出寄存器个数,则将需传递参数块所在内存区首址放在寄存器中传递(除调用号以外,最多6个参数)。传递参数的寄存器顺序依次为:EAX(调用号)以及最多6个参数EBX、ECX、EDX、ESI、EDI和EBP。
    返回参数为整数值:正数或0表示成功,负数表示出错码
    封装函数对应的机器级代码有一个统一的结构:总是若干条传送指令后跟一条陷阱指令(如int $0x80)。
    传送指令用来传递系统调用的参数,陷阱指令用来陷入内核进行处理。
    例如,若用户程序调用系统调用write(1, “hello, world! ”,14),将字符串“hello, world! ”中14个字符显示在标准输出设备文件stdout上,则其封装函数对应机器级代码(用汇编指令表示)如下:
    movl  $4, %eax       //调用号为4,送EAX
    movl  $1, %ebx       //标准输出设备stdout的文件描述符为1,送EBX 
    movl  $string, %ecx  //字符串“hello, world!
    ”首址送ECX 
    movl  $14, %edx     //字符串的长度为14,送EDX
    int   $0x80         //系统调用
     
    软中断指令int $0x80的执行过程:
    它是陷阱类(编程异常)事件,因此它与异常响应过程一样。
    1)    将IDTi(i=128)中段选择符(0x60)所指GDT中的内核代码段描述符取出, 其DPL=0,此时CPL=3(因为int $0x80指令在用户进程中执行),因而CPL>DPL且IDTi 的 DPL=CPL,故未发生13号异常。
    2)    读 TR 寄存器,以访问TSS,从TSS中将内核栈的段寄存器内容和栈指针装入SS和ESP; 
    3)    依次将执行完指令int $0x80时的SS、ESP、EFLAGS、CS、EIP的内容(即断点和程序状态)保存到内核栈中,即当前SS∶ESP所指之处; 
    4)    将IDTi(i=128)中段选择符(0x60)装入CS,偏移地址装入EIP。这里,CS:EIP即是系统调用处理程序system_call(所有系统调用的入口程序)第一条指令的逻辑地址。
    通过快速系统调用指令进入和退出系统调用:
    执行int $0x80需一连串的一致性和安全性检查,因而速度较慢。从Pentium II开始,Intel增加了三个特殊的MSR寄存器,引入了快速系统调用指令sysenter和sysexit,分别用于从用户态到内核态、从用户态到内核态的快速切换。
    • YSTEM_CS_MSR: 存放内核代码段的段选择符。
    • YSTEM_EIP _MSR: 存放内核中系统调用处理程序的起始地址。 
    • YSTEM_ESP _MSR: 存放内核栈的栈指针。
    执行sysenler指令时,CPU将SYSTEM_CS_MSR、SYSTEM_EIP_MSR和SYSTEM_ESP_MSR的内容分别复制到CS、EIP和ESP,同时将SYSTEM_CS_MSR的内容加8的值设定到SS。因此,CPU执行完sysenter指令,即可切换到内核态,并开始执行系统调用处理程序的第一条 指令。
    MSR寄存器的内容只能通过特权指令rdmsr和wrmsr进行读写。 
  • 相关阅读:
    html集合
    pyautocad
    CAD 批量提取点坐标,实现坐标的快速提取
    CAD
    python模块
    set,get,setter
    1 Http的表皮
    (6)小项目------完善增删改查的操作
    SSM学习笔记(6)---拦截器
    SSM学习笔记(5)-CGLIB动态代理
  • 原文地址:https://www.cnblogs.com/yangyuliufeng/p/9214400.html
Copyright © 2011-2022 走看看