操作系统学习之系统调用

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(使用前将#替换为@)

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

  • 读《大数据时代》后的一些感想

    最近快速阅读了 大数据时代 后 写下自己的一些感想 xff0c 自己也稍微清楚大数据这个概念吧 xff01 随着2012年云技术的迅速发展 xff0c 大数据也紧跟其后出现了 xff0c 而且近期受到许多行业的关注 几乎稍微有在网上逛逛的都
  • 程序人生之一:一个四年 JAVA 程序员的工作经历

    程序人生之一 xff1a 一个四年 JAVA 程序员的工作经历 很感谢 CSDN 网友liudonglovehemin 的这篇帖子 xff0c 真实记录了一个 Java 程序员的 4 年来在北京工作 学习 生活的成长之路 此情此景 xff0
  • 一步一步写算法(之 算法总结)

    声明 xff1a 版权所有 xff0c 欢迎转载 xff0c 请勿用于商业用途 联系信箱 xff1a feixiaoxing 64 163 com 自10月初编写算法系列的博客以来 xff0c 陆陆续续以来写了几十篇 按照计划 xff0c
  • 我人生的转折点

    来到兄弟连 差不多快两周的时间了 xff0c 在这里的每一天每天都觉得非常的充实 xff0c 来到这里才知道什么才做学习 xff0c 什么才叫只要努力了用功了 xff0c 用心了 xff0c 就会有成果 就如第一次的测验 xff0c 每天都
  • Canal AdminGuide

    背景 先前开源了一个开源项目 xff1a 阿里巴巴开源项目 基于mysql数据库binlog的增量订阅 amp 消费 本文主要是介绍一下如何部署 amp 使用 环境要求 1 操作系统 a 纯java开发 xff0c windows linu
  • 【Android病毒分析报告】 - Usbcleaver

    本文章由Jack Jia编写 xff0c 转载请注明出处 文章链接 xff1a http blog csdn net jiazhijun article details 9179749 作者 xff1a Jack Jia 邮箱 xff1a
  • 【浅墨著作】《逐梦旅程:Windows游戏编程之从零开始》勘误&配套源代码下载...

    I 39 m back 恩 xff0c 几个月不见 xff0c 大家还好吗 xff1f 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧 woxiangnifrr童鞋说每天都在来浅墨的博客逛一下看有没有更新 xff0c
  • Anychart图表系列九之Dashboard

    Dashboard中文释义为仪表盘 控制台 xff0c 这个用词很生动 xff0c 它指的是多个图组合在一起的效果 xff0c 就像模具工作中的操作台一样由多种图形仪器组成 在项目中 xff0c 特别是高管平台 xff0c 领导看重的是多套
  • 若依前后端分离版本启动教程

    第一步 xff1a 搜索若依官网 第二步 xff1a 选择前后端分离版本 第三步 复制链接 第四步 随便在自己的电脑找找一个文件夹 xff0c 执行git命令 xff08 git安装使用教程这里不做说明 xff09 回车 96 96 96
  • char指针与char数组的区别(非常详细!)

    首先看指针 char p 61 helloworld 在这里p 是一个变量 其类型为指针类型 并且指向一个字符串 字符串内容为 helloworld 如果要访问p 2 的话 就需要先从p 中取出地址 该地址为 helloworld 的首地址
  • 大学六年我读过的一些书

    明天就是2014年 xff0c 今晚是13年最后一天 xff0c 我想不少人会写一下自己13年的一些心得 xff0c 在上一篇日志中 xff0c 该总结的已经总结 xff0c 想了解更多的已经加我个人微信了 我在想 xff0c 大学其实很多
  • Ubuntu硬盘分区和分区文件类型及Linux分区基础知识

    Ubuntu硬盘分区的常用系统 xff0c 于是我学习研究了Ubuntu硬盘分区 xff0c 在这里对大家详细介绍下Ubuntu硬盘分区应用 xff0c 希望对大家有用Ubuntu硬盘分区包含了非常好的翻译和容易使用的架构 如果你准备在硬盘
  • 欢迎使用CSDN-markdown编辑器

    我和谁都不争 xff0c 和谁争 xff0c 我都不屑 xff1b 我爱大自然 xff0c 其次就是艺术 xff1b 我双手烤着生命之火取暖 xff0c 火萎了 xff0c 我也准备走了 本Markdown编辑器使用StackEdit修改而
  • 从高考到程序员--------你到底在追求着什么?------串烧似的文章

    随便写写 xff0c 万事开头难 xff0c 不知道应该怎么写出来 xff0c 因为只有自己经历的才能是最美好的回忆 xff0c 不知道这个编辑器写的效果如何 xff0c 凑合着看吧 xff0c 从高考到程序员征文看了几篇 xff0c 决定
  • AI以来----已不再是未来

    在过去的2016年 xff0c 可以说AI的核心发展一直围绕着开源和生态 国际巨头纷纷涉足深度学习平台 xff0c 让原本是高高在上的人工智能 xff0c 迅速落地细化到了行业的各个领域 随着AI技术正在为全球开发者所用 xff0c 极大的
  • 即兴嘻哈

    kao ha wowo 深夜不能寐 xff0c 那个翻来覆也不能把觉睡 一首即兴style说说ni为何半夜还不睡 xff0c 一线城市压力大来人总疲惫 xff0c 为了买房买车拼命都在向前奔 年轻人出来打拼为何这么累 xff0c 多少人为了
  • 裸辞3个月扛不住后,随便接了offer更惨!

    最近发现年底找工作的人不少 xff0c 部门里就2个hc xff0c 一周能收2000 43 简历 xff0c 这比例有点 过分 了 虽说大部分是年底先看看机会试试水 xff0c 准备年后冲击的 xff0c 但看简历里也有不少中间裸辞的 x
  • Docker常用命令-自用

    Docker常用命令 自用 1 镜像仓库 1 1 登陆 登出 登陆 默认Docker Hub docker login u span class token punctuation span username span class toke

随机推荐

  • 程序猿的浪漫之二进制表白篇

    那天情人节 xff0c 我给她发了一串数字 xff08 01001001 00100000 01101100 01101111 01110110 01100101 00100000 01111001 01101111 01110101 xf
  • Dockerfile使用教程

    第一 创建一个spring boot项目 第二 创建 xff1a Dockerfile文件 xff08 在项目根目录下 xff09 第三 复制粘贴 FROM java 8 设置基础镜像 FROM openjdk 8 jdk alpine 指
  • C++ 用socket封装成http

    HttpSocket h interface for the CHttpSocket class if defined AFX HTTPSOCKET H F49A8F82 A933 41A8 AF47 68FBCAC4ADA6 INCLUD
  • echarts更换主题

    前言 本篇文章基于上一篇文章 xff1a vue工程整合echarts xff0c 因此这里主要讲的是主题是如何配置的 xff0c 其他代码在这里不再赘述 官网中已经说明了echarts除了有默认的主题外 xff0c 并且内置了dark主题
  • Java final修饰符详解

    final 在 Java 中的意思是最终 xff0c 也可以称为完结器 xff0c 表示对象是最终形态的 xff0c 不可改变的意思 final 应用于类 方法和变量时意义是不同的 xff0c 但本质是一样的 xff0c 都表示不可改变 x
  • Python Requests库安装和使用

    Python 提供了多个用来编写爬虫程序的库 xff0c 除了前面已经介绍的 urllib 库之外 xff0c 还有一个很重的 Requests 库 xff0c 这个库的宗旨是 让 HTTP 服务于人类 Requests 是 Python
  • C语言 十进制转十六进制

    问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式 它有0 1 2 3 4 5 6 7 8 9 A B C D E F共16个符号 xff0c 分别表示十进制数的0至15 十六进制的计数方法是满16进1 xff0c 所以十进
  • Pandas知识点超全总结

    Pandas知识点超全总结 一 数据结构1 Series1 创建2 切片 修改3 其他属性 2 DataFrame1 创建2 切片3 增加 修改4 删除5 查看 二 读写数据1 读数据1 excel文件2 csv文件3 sql文件 2 写数
  • socket通信小结

    1 网络中的进程之间如何进行通信 区别于本地的进程间通信 xff0c 我们首要解决的问题是如何唯一标识一个进程 xff0c 否则通信无从谈起 xff01 在本地可以通过进程PID来唯一标识一个进程 xff0c 但是在网络中这是行不通的 其实
  • eclipse alt+/代码智能提示总是报错:problems during content assist

    解决办法如下图 xff1a 依次点击红框标记的地方即可解决问题
  • linux C 遍历目录及其子目录 opendir -> readdir -> closedir

    在 linux 下遍历某一目录下内容 LINUX 下历遍目录的方法一般是这样的 xff1a 打开目录 gt 读取 gt 关闭目录 相关函数是 opendir gt readdir gt closedir xff0c 其原型如下 xff1a
  • 最全面的 linux 信号量解析

    一 xff0e 什么是信号量 信号量的使用主要是用来保护共享资源 xff0c 使得资源在一个时刻只有一个进程 xff08 线程 xff09 所拥有 信号量的值为正的时候 xff0c 说明它空闲 所测试的线程可以锁定而使用它 若为 0 xff
  • vue3学习一:let和const

    在函数的内部 xff0c 定义name变量 xff0c 当i等于false时 xff0c 按照Java语言 xff0c else里是拿不到name的 xff0c 并且会显示报错 xff0c 但是却不会报错 xff0c 这是因为javascr
  • PHP 中最全的设计模式(23种)

    PhpDesignPatterns PHP 中的设计模式 一 Introduction 介绍 设计模式 xff1a 提供了一种广泛的可重用的方式来解决我们日常编程中常常遇见的问题 设计模式并不一定就是一个类库或者第三方框架 xff0c 它们
  • 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

    我遇到的出现这种错误的原因一般是以下几种情况 xff1a 1 在绑定数据控件的时候 xff0c 建立数据库连接 OleDbConnection conn 61 new OleDbConnection 34 provider 61 micro
  • 连接不上Github,网络超时的检查和解决办法

    先附上图片吧 连接不上github但是其它网站都是正常上网 解决办法 win 43 r打开运行输入cmd 再命令行里输入 ping github com 看看返回值 我的全是请求超时 xff0c 发送的数据包全丢 xff08 我先ping了
  • 2018校招笔试真题汇总

    2018校招笔试真题汇总 最近看好多牛油贡献了很多考试的真题 xff0c 我把他们汇总在一起给到大家 xff0c 也感谢这些牛油的贡献 xff0c 只要进这个汇总贴的 xff0c 你们都将每人获得一份牛客送出的礼物一份 科大讯飞 xff1a
  • 【2】Docker的启动与停止

    1 xff09 启动 docker systemctl start docker 2 xff09 查看 docker 状态 systemctl status docker 3 xff09 查看 docker 概要信息 docker info
  • 【8】Docker中部署Redis

    1 xff09 拉取镜像 docker pull redis 这是我在 VMware 的 CentOS 中装过的 redis 版本 xff0c 拉取该指定版本使用 docker pull redis 5 0 12 命令 xff0c 不过下面
  • 操作系统学习之系统调用

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