目 录CONTENT

文章目录

系统调用.md

geekrabbit
2022-10-30 / 0 评论 / 1 点赞 / 61 阅读 / 1,346 字 / 正在检测是否收录...
温馨提示:
创作不易,转载请注明出处
广告 广告

什么是系统调用

大白话:就是用户态到内核态的过程

系统调用是在程序中能用类似函数调用方式调用的操作系统服务的集合。每一种操作系统服务占用一条系统调用命令(或函数)。系统调用是操作系统给用户提供的程序级接口。如果一个用户需要在程序中使用操作系统的服务,则只能通过系统调用。系统调用与一般过程调用的主要区别是运行的状态不同。系统调用全部运行在内核态,而一般过程调用运行在用户态。此外,系统调用需要经过陷入,而一般的函数调用是直接跳转。

由于用户程序在目态下不能直接使用I/O指令等特权指令,为了解决这一问题,操作系统编制了许多不同功能的子程序,供用户程序执行中调用,这些由操作系统提供的子程序称为“系统功能调用”程序,简称“系统调用”。

如何实现用户态与内核态之间的切换

int 0x80指令将用户态的执行模式转变为内核态,并将控制权交给系统调用过程的起点 system_call () 处理函数。总结起来, 执行态切换 过程如下:

(1) 应用程序在 用户态 准备好调用参数,执行 int 指令触发 软中断 ,中断号为 0x80 ;

(2) CPU 被软中断打断后,执行对应的 中断处理函数 ,这时便已进入 内核态 ;

(3) 系统调用处理函数 准备 内核执行栈 ,并保存所有 寄存器 (一般用汇编语言实现);

(4) 系统调用处理函数 根据 系统调用号 调用对应的 C 函数—— 系统调用服务例程 ;

(5) 系统调用处理函数 准备 返回值 并从 内核栈 中恢复 寄存器 ;

(6) 系统调用处理函数 执行 ret 指令切换回 用户态 ;

系统调用与库函数的区别

  1. 所有c函数库是相同的,但是不同操作系统的系统调用则不相同
  2. 函数库调用是调用函数库中的程序,而系统调用调用的是内核的服务
  3. 库函数的调用是在用户空间执行,而系统调用则是在内核空间执行
  4. 函数库调用属于过程调用,开销较小,而系统调用需要进行用户态和内核态的上下文切换,开销较大

系统调用的意义

  1. 避免了用户直接对底层硬件的编程。比如像终端打印信息,终端对系统来说是硬件资源,如果没有系统调用,用户则需要编写终端设备驱动的代码,以及控制终端如何显示的代码
  2. 隐藏背后的技术细节:使用write系统调用,用户则不用关系数据在磁盘的那个磁道的那个扇区,以及数据要加载到内存的什么位置。
  3. 保证系统的安全性和稳定性:避免了用户直接对内核空间的操作,避免了安全隐患。
  4. 方便程序的编程:大家都使用一个接口,移植起来就很方便,如果是自己写自己的,移植性会不好。

什么功能要用到系统调用

  1. 设备管理:完成设备的请求/释放/启动等功能

  2. 文件管理:完成文件的读/写/创建/删除等功能

  3. 进程控制:完成进程的创建/撤销/阻塞/唤醒等功能

  4. 进程通信:完成进程之间的消息传递/信号传递等功能

  5. 内存管理:完成内存的分配/回收等功能

系统调用的过程

  1. 当系统发起调用是,通常通过一个陷阱(TRAP)的特殊硬件指令,(把它理解成一个操作步骤(好理解点))
    ​ 硬件将控制转移到预先设置的OS==>预先指定的陷阱处理程序–trap handler, ==>与此同时,将特权级别提升到内核模式
  2. 在内核模式下,OS完全掌握访问系统硬件的权利,比如进行IO操作,为程序赋予更多的内存等等
  3. 在OS完成请求服务时,通过特殊的陷阱返回指令(return from trap),将控制权交还给用户,该指令返回到用户模式,同时将控制权交给应用程序,回归本源!
1
广告 广告

评论区