操作系统学习之系统调用

2023-05-16

目录

一、操作系统学习之系统调用

1. 什么是系统调用

2. 系统调用有什么用

3. 为什么需要系统调用

4. 系统调用的具体流程

1)执行过程

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

3) 系统调用常见名词

4)  系统调用如何返回、传递返回值

5)  系统调用如何传递参数

5. 栈切换 

6. 系统调用的类型有哪些

7. 系统调用有什么缺点


一、操作系统学习之系统调用

      1. 什么是系统调用

    操作系统内核都有一组实现系统功能的过程,系统调用就是对上述过程的调用。用户程序利用系统调用,向操作系统发出服务请求;操作系统通过系统调用为运行于其上的应用程序提供服务。

2. 系统调用有什么用

主要有以下两个方面原因:

a. 系统调用可以为用户空间提供访问硬件资源的统一接口

    有了系统调用,应用程序便不必去关注具体的硬件访问操作。比如,读写文件时,应用程序不用去管磁盘类型,甚至不用关心是哪种文件系统。

b.  系统调用可以对系统进行保护,保证系统的稳定和安全性

    系统调用的存在规定了用户进程进入内核的具体方式,换句话说,用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不准许肆意跳入内核。有了这样的进入内核的统一访问路径限制才能保证内核的安全。

3. 为什么需要系统调用

    一般情况下,进程是不能够直接存取系统内核的。它不能存取内核的内存段,也不能调用内核函数,CPU的硬件结构保证了这一点。只有系统调用是一个例外。

    由于系统资源可能同时被多个应用程序访问,如果不加保护,那各个应用程序之间可能会产生冲突,对于恶意应用程序更可能导致系统奔溃。这里所说的系统资源包括文件、网络、各种硬件设备等。

    系统调用提高了系统的安全性,可以先检查请求的正确性。

4. 系统调用的具体流程

     1)执行过程

  系统调用的执行过程,主要包括用户空间到内核空间的转换阶段、系统调用处理程序systemc_call到系统调用服务例程的阶段。

        如上图,系统调用执行的流程如下:

        (1) 应用程序代码调用系统调用(xyz),该函数是一个包装系统调用的库函数;

        (2) 库函数(xyz)负责准备向内核传递的参数,并触发软中断以切换到内核;

        (3) CPU被软中断打断后,执行中断处理函数,即系统调用处理函数(system_call);

        (4) 系统调用处理函数调用系统调用服务例程(sys_xyz),真正开始处理该系统调用;

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

         Linux系统中,实现系统调用利用了 i386 体系结构中的软件中断。即调用了 ini 0x80 汇编指令。 这条汇编指令将产生向量为128的编程异常,CPU便被切换到内核态执行内核函数,转到系统调用处理函数的入口:system_call()

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

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

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

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

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

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

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

     3) 系统调用常见名词

(1) 软中断

即软件中断;

(2) 中断号

用于在中断向量表中寻找中断号对应的中断处理函数;

如:system_call()

(3) 中断处理函数     

       中断处理程序除了系统调用(0x80),还有如除0异常(0x00)、缺页异常(0x14)等等

       0x80对应的中断处理函数就是 system_call

(4) 系统调用号

       不同的系统调用号,对应不同的系统调用服务例程。通过系统调用号可以在系统调用表里面获取对应的系统调用服务例程函数地址。其实就是系统调用内核函数的地址偏移。

(5) 系统调用表

               存储系统调用号对应的系统调用服务例 程函数地址。

      sys_call_table 就是系统调用表,每一个long元素(4字节)都是  一个系统调用地址,所以 *sys_call_table(,%eax,4)的含义就是sys_call_table上偏移量为0+%eax*4元素所指向的系统调用,即第%eax个系统调用。

(6) 系统调用服务例程

      具体的系统调用执行函数。

4)  系统调用如何返回、传递返回值

    系统调用处理函数(system_call) 执行 ret 指令切换回用户态。获取系统调用的返回值也是通过寄存器,在x86系统上,返回值放在eax中。

5)  系统调用如何传递参数

  (1) 传递系统调用号   

       在x86架构中,用户空间将系统调用号是放在eax中的,系统调用处理程序通过eax取得系统调用号。

          (2) 传递系统调用参数

      普通的函数的参数传递是通过把参数值写入堆栈来实现的。但系统调用是一种特殊的函数,它由用户态进入了内核态,所以它既不能使用用户态的堆栈,也不能使用内核态的堆栈。

    系统调用的参数也是通过寄存器传给内核的,在x86系统上,系统调用的前5个参数放在ebx,ecx,edx,esi和edi中,如果参数多的话,还需要用个单独的寄存器存放指向所有参数在用户空间地址的指针。

      5. 栈切换 

            1) 因为在linux中,用户态和内核态使用的是不同的栈,两者负责各自的函数调用,互不干扰。在执行int $0x80时,程序需要由用户态切换到内核态,所以程序当前栈也要从用户栈切换到内核栈。与之对应,当中断程序执行结束返回时,当前栈要从内核栈切换回用户栈

            2) 这里说的当前栈指的就是ESP寄存器的值所指向的栈。ESP的值位于用户栈的范围,那程序的当前栈就是用户栈,反之亦然。此外寄存器SS的值指向当前栈所在的页。因此,将用户栈切换到内核栈的过程是:

              a. 将ESP、SS等值设置为内核栈的相应值。

              b. 将当前ESP、SS等寄存器的值存到内核栈上。

              c. 反之,从内核栈切换回用户栈的过程:恢复ESP、SS等寄存器的值,也就是用保存在内核栈的原ESP、SS等值设置回对应寄存器。

      6. 系统调用的类型有哪些

     系统调用大致可分为六大类:

     1) 进程控制(process control);

     2) 文件管理(file manipulation);

     3) 设备管理(device manipulation);

     4) 信息维护(information maintenance);

     5) 通信(communication);

     6) 保护(protection)

      7. 系统调用有什么缺点

            系统调用需要从用户空间陷入内核空间,处理完后,又需要返回用户空间。其中除了系统调用服务例程的实际耗时外,陷入/返回过程和系统调用处理程序(查系统调用表、存储\恢复用户现场)也需要花销一些时间,这些时间加起来就是一个系统调用的响应速度。

           频繁进行系统调用会影响应用程序的性能,调用时间开销大。减小这种开销的好方法是,在程序中尽量减少系统调用的次数,并且让每次系统调用完成尽可能多的工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统学习之系统调用 的相关文章

  • IdeaVim插件使用技巧

    在 url 61 http kidneyball iteye com blog 1814028 IDEA Intellij小技巧和插件 url 一文中简单介绍了一下IdeaVim插件 在这里详细总结一下这个插件在日常编程中的一些常用小技巧
  • 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

    作者 xff1a 寒小阳 amp amp 龙心尘 时间 xff1a 2015年11月 出处 xff1a http blog csdn net han xiaoyang article details 49797143 声明 xff1a 版权
  • Android 获取系统设置参数。

    转载自 xff1a http blog 163 com fang wang2005 blog static 176928073201136105613638 如何获取Android系统设置参数 下面以获取时间格式为例 xff0c 来判断时间
  • linux下默认删除文件到回收站(bash实现)

    fedora下总是会把文件不小心删除了 xff0c 所以下面的脚本把实现 xff1a 文件删除默认移动到自己的回收站里面 功能 xff1a 脚本实现删除文件或者目录到 waste xff08 自己定义 xff09 脚本附带文件名或者目录名
  • android 开机启动程序

    做一个android开机就会自动启动的程序 xff0c 该程序只要启动一次 xff0c 以后开机就会自动启动 xff0c 直到删除该程序 android开机事件会发送一个叫做Android intent action BOOT COMPLE
  • 在 Linux 平台中调试 C/C++ 内存泄漏方法

    由于 C 和 C 43 43 程序中完全由程序员自主申请和释放内存 xff0c 稍不注意 xff0c 就会在系统中导入内存错误 同时 xff0c 内存错误往往非常严重 xff0c 一般会带来诸如系统崩溃 xff0c 内存耗尽这样严重的后果
  • Java 位运算

    Java 位运算 转 一 xff0c Java 位运算 1 表示方法 xff1a 在Java语言中 xff0c 二进制数使用补码表示 xff0c 最高位为符号位 xff0c 正数的符号位为0 xff0c 负数为1 补码的表示需要满足如下要求
  • iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem

    1 UINavigationController导航控制器如何使用 UINavigationController可以翻译为导航控制器 xff0c 在iOS里经常用到 我们看看它的如何使用 xff1a 下面的图显示了导航控制器的流程 最左侧是
  • OpenStack多节点部署(一)——服务器选型

    OpenStack多节点部署 xff08 一 xff09 服务器选型 OpenStack多节点部署 xff08 二 xff09 操作系统安装 OpenStack多节点部署 xff08 三 xff09 网络配置 OpenStack多节点部署
  • 【代码】使用C++实现改进的有效边表算法。

    算法的解释和一些细节晚一些再上传 xff0c 先直接上代码 xff1a 如果有错误可以在评论区指出 由于opengl使用实数的坐标 xff0c 所以 xff0c 本程序将使用画线代替画点 include lt GL glut h gt in
  • FireFox导入导出Cookies和收藏夹的方法

    FireFox是一个常用的浏览器 xff0c 扩展插件众多 xff0c 和IE相比有很多优点 xff0c 不过有些细小的地方似乎考虑的不太好 xff0c 比如用户经常会碰到系统重新安装等问题 xff0c 这就需要导入导出FireFox浏览器
  • linux交换分区回收

    author xff1a skate time xff1a 2012 04 11 交换分区回收 如果系统过多的使用交换分区 xff0c 那性能将会变慢 xff0c 所以要找到大量使用交换分区的原因 回收交换分区可以用如下 xff1a swa
  • Linux下查看文件和文件夹大小的df和du命令

    当磁盘大小超过标准时会有报警提示 xff0c 这时如果掌握df和du命令是非常明智的选择 df可以查看一级文件夹大小 使用比例 档案系统及其挂入点 xff0c 但对文件却无能为力 du可以查看文件及文件夹的大小 两者配合使用 xff0c 非
  • 算法系列之九:计算几何与图形学有关的几种常用算法(一)

    我的专业是计算机辅助设计 xff08 CAD xff09 xff0c 算是一半机械一半软件 xff0c 计算机图形学 是必修课 xff0c 也是我最喜欢的课程 热衷于用代码摆平一切的我几乎将这本教科书上的每种算法都实现了一遍 xff0c 这
  • uiviewController管理UITableView

    iOS开发 xff1a 如何作为子类来创建和管理UITableView 已有 184 次阅读 2011 10 24 21 38 标签 UIViewController UIView UITableView iOS 在iPhone应用开发中个
  • 【Iphone 游戏开发之一】创建视图并绘制简单图形

    Himi 原创 xff0c 转载请注明 xff01 原文地址 xff1a http blog csdn net xiaominghimi article details 6633172 这段时间N忙 xff0c 没办法 xff0c 创业公司
  • archlinux中virtualbox无法运行问题解决

    在archlinux中安装完成virtualbox后 xff0c 新建虚拟机无法启动 xff0c 而是出现下图的提示 xff1a 在fedora中直接用root权限运行 etc init d vboxdrv setup重新加载一下驱动就可以
  • 【Linux】Ubuntu 代理配置

    apt get 设置代理 proxy 方法 方法一 xff1a 这是一种临时的手段 xff0c 如果你仅仅是暂时需要通过http代理使用apt get xff0c 你可以使用这种方法 在使用 apt get 之前 xff0c 在终端中输入以

随机推荐

  • 百度之星之E:C++ 与Java

    E C 43 43 与Java 时间限制 2000ms 内存限制 65536kB 描述 在百度之星的贴吧里面 xff0c Java的爱好者和C 43 43 的爱好者总是能为这两种语言哪个更好争论上几个小时 Java的爱好者会说他们的程序更加
  • 并查集详解

    并查集是我暑假从高手那里学到的一招 xff0c 觉得真是太精妙的设计了 以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定 不分享出来真是对不起party了 xff08 party xff1a 我靠 xff0c 关我嘛事啊 xff1f
  • ubuntu18.04 开启ssh远程服务

    1 查看ssh服务是否已经开启 说明 xff1a 1 ssh agent 指的是ubuntu的ssh服务的客户端 xff0c 用于该ubuntu远程连接其它Linux主机 如果没有ssh agent的话 xff0c 该ubuntu主机也无法
  • Python必备知识之“if __name__ == ‘__main__‘:”

    在学习Python的过程中经常会看到 if name 61 61 39 main 39 这行代码 xff0c 那么这行代码的作用究竟是什么呢 xff1f if name 61 61 39 main 39 这行代码的主要作用是调试某个模块的正
  • Windows Server 网络连接由公用网络改为专用网络

    主题 xff1a Windows Server 网络连接由公用网络改为专用网络 关键字 xff1a 问题描述 xff1a Windows Server 2012 r2 启动后网络连接被识别为公用网络 xff0c 导致远程桌面等服务无法使用
  • 关于书籍(WPF及其它)

    原文 xff1a On Books WPF and Otherwise 有人让我去看coding horror comparison xff0c 这篇文章来至于Charles Petzold和Adam Nathan的书籍 xff0c 是关于
  • pip,pip安装源

    介绍 Python在使用pip安装第三方包 第三方功能库的时候 xff0c pip3 pip install xxx走的是国外源 xff0c 有点慢 我们可以采用国内源加快下载的速度 常用pip源 xff1b 豆瓣 xff1a https
  • 安装Anaconda时安装路径错误,提示Directory" xxx is not empty ,please choose a different location."问题的解决方案

    错误如下图所示 重新选择路径 xff0c 选择平时安装的盘 xff0c 然后手动输入Anaconda xff0c 即可正常安装 xff08 在这一步之前一定要删除卸载 先前安装产生的文件夹 xff09 进QQ群 xff08 77980901
  • vue项目引入PWA(vue-cli4)

    1 概念 PWA 全称为 Progressive Web App xff0c 中文译为渐进式 Web APP 其目的是通过各种 Web 技术实现与原生 App 相近的用户体验 也就是说 xff0c 只要你使用浏览器 xff0c 就可以实现免
  • Linux远程管理协议(RFB、RDP、Telnet和SSH)

    提到远程管理 xff0c 通常指的是远程管理服务器 xff0c 而非个人计算机 个人计算机可以随时拿来用 xff0c 服务器通常放置在机房中 xff0c 用户无法直接接触到服务器硬件 xff0c 只能采用远程管理的方式 远程管理 xff0c
  • Python第三方库(模块)下载和安装(使用pip命令)

    Python第三方库是由社区开发者编写的代码包 xff0c 用于增强Python的功能和提供各种特定的功能 通常 xff0c 这些库被打包为模块 xff0c 可以通过使用Python包管理工具pip来下载和安装 以下是使用pip下载和安装P
  • 计蒜客T1098 大整数加法

    求两个不超过 200 位的非负整数的和 输入格式 有两行 xff0c 每行是一个不超过 200 位的非负整数 xff0c 可能有多余的前导 0 输出格式 一行 xff0c 即相加后的结果 结果里不能有多余的前导 0 xff0c 即如果结果是
  • Linux系统学习(三)Linux系统管理

    用户和组管理 1 配置文件 passwd文件 位置 xff1a etc passwd xff1b 对任何用户可读 作用 xff1a 用于保存各用户的账户信息 shadow文件 位置 xff1a etc shadow xff1b 只对root
  • HTTP Host 头攻击 -- 学习笔记

    目录 1 HTTP Host头攻击 2 HTTP Host头的作用 3 什么是HTTP Host头攻击 4 如何发掘HTTP Host头攻击 修改Host值 添加重复的Host头 使用绝对路径的URL 添加缩进或换行 注入覆盖Host头的字
  • Linux 网络流量监控工具

    Linux 网络流量监控 Linux 网络流量监控是捕获和分析企业的 Linux 网络流量的过程 为什么要监控 Linux 网络流量 深入了解网络流量对于测量和管理带宽使用情况非常重要 分析 Linux 网络流量有助于识别带宽瓶颈 最高用量
  • 【解决“Authentication is required to create a color profile/managed device“】

    解决Ubantu系统 34 Authentication is required to create a color profile managed device 34 问题 xff1a 在Windows下使用远程桌面连接到工作站的Uban
  • 漫谈微信开放平台一(小程序服务器url设置)

    点击查看文档 这里的是需要用开放平台设置特约商户的域名 两种域名 xff0c 1 服务器域名 2 业务域名 两种域名设置方案相似 xff0c 我以服务器域名设置为例 需要注意 xff1a 1设置的域名需要在开放平台进行设置 xff08 注意
  • linux / ubuntu / 添加和查看环境变量的方法

    一 添加 1 export 指令 export PATH 61 PATH home xiaoming Doc 将 home xiaoming Doc 放到了名为 PATH 的环境变量的后面 或者 export PATH 61 home xi
  • 504 Gateway Time-out原因及解决方法

    1 今天在webpack通过proxy开发的时候 xff0c 接口时正常的 xff0c 但是上到测试机 xff0c 通过nginx转发的时候 xff0c 就会出现504 Gatway time out 思路 1 xff0c 初步判断时ngi
  • 操作系统学习之系统调用

    目录 一 操作系统学习之系统调用 1 什么是系统调用 2 系统调用有什么用 3 为什么需要系统调用 4 系统调用的具体流程 1 xff09 执行过程 2 如何实现用户态与内态之间的切换 3 系统调用常见名词 4 系统调用如何返回 传递返回值