【面试心得】系统调用

这个问题也是在九识面试的时候被问到的,当时我说就是像Shell,从用户态转移到内核态的过程,面试官让我说的详细一点,我就说不出来了,然后我就说了一些函数调用的过程,hhhh。
现在在这里做一个记录吧。

本文部分摘抄自:
终于把系统调用给整明白了~ 
系统调用【简单总结】_系统调用的过程_aristo_boyunv的博客-CSDN博客 
系统调用原理及详细过程_系统调用过程_BugM的博客-CSDN博客

什么是系统调用

操作系统为了防止各类应用程序可能会破坏系统资源,对系统资源做了保护,阻止应用程序直接去访问这些资源,而应用程序又有访问这些系统资源的需求,因此操作系统提供了系统调用,让所有的应用程序统一通过系统调用来访问系统资源(如文件、网络、内存、IO等)

系统调用的过程

应用程序可以进行系统调用,也可以调用标准库或者API

系统统调用需要进行模式切换,而每个完整的应用程序都有两个栈,一个用户栈,一个内核栈。
这两个栈是独立的,用户栈在用户空间,内核栈在内核空间,因此切换模式时,栈也得切换。

因此我们可以将系统调用的执行步骤分为三步:
1.执行前的准备工作。
2.执行处理程序(处理函数)。
3.执行后的善后工作。
当然内核模式切换和栈切换就是1和3的工作了,这里的三步都是在内核模式下执行的

以fork为例讲讲系统调用的实现 

 

上图为系统调用涉及到的9个步骤

1.应用程序调用linux库提供的fork函数,发起一个fork系统调用,这个系统调用的目的是创建一个子进程,这个子进程拷贝一份父进程的虚拟进程空间。

2.fork函数的第一步就是将2放入寄存器eax,每个系统调用都有一个编号,2就是fork系统调用的编号,eax是默认用于传递系统调用编号的寄存器。

如果系统调用有参数,则将参数传入到如下的寄存器EBX,ECX,EDX,ESI,EDI,EBP,可以看出系统调用最多支持6个参数,fork系统调用没有参数。

fork函数的第二步就是执行中断指令int 0x80,中断指令int用于发送中断信号给处理器,0x80为中断向量号,这个向量号是系统调用中断处理程序专用。

int指令同时也会将模式从用户态切换到内核态,用户栈切换到内核栈,同时会将当前被中断的应用程序,中断时的寄存器内容入栈(SS,ESP,EFLAGS,CS,EIP),这里的入栈指的是入内核栈(每一个应用程序都一个用户栈和内核栈)

3.处理器执行完当前的指令后,会检查处理器的中断引脚,发现有中断信号,然后检查状态寄存器(EFLAGS),发现中断屏蔽IF标志是打开的(系统调用中断信号不会被屏蔽),处理器根据中断信号,分析出中断向量号,然后根据中断向量号去查找中断描述符表,找到了该中断向量号对应的中断处理程序。

4.操作系统跳转到中断处理程序,然后开始执行中断处理程序,0x80对应的中断处理程序是系统调用中断处理程序(system_call)。

该中断处理程序首先会将EAX,EBX,ECX,EDX,ESI,EDI,EBP这几个寄存器入栈,之所以入栈,就是为了防止后续的工作覆盖这些寄存器

5.系统调用中断处理程序紧接着根据系统调用号(这里就是fork系统调用号即2),去系统调用表进行查找,可以找到该系统调用号对应的处理程序(也可以叫处理函数),Linux操作系统的系统处理函数一般以sys开头,fork的系统处理函数就是sys_fork。

6.找到了系统处理函数后,开始执行该函数,处理函数可以从内核栈中获取函数的参数,函数执行完成后,函数的返回值,默认采用EAX寄存器进行返回

7~8.系统处理函数执行完成后,回到了系统调用中断处理程序,中断处理程序执行iret指令,iret指令负责从内核态切换到用户态,将内核态入栈的寄存器数据出栈到SS,ESP,EFLAGS,CS,EIP这几个寄存器,然后跳转到系统调用处。

9.系统调用fork返回到应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/128071.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心一言初体验,和ChatGPT语言理解能力比较

文章目录 第一个考验,语义理解第二个考验,历史问题的回答推荐阅读 百度旗下AI大模型文心一言宣布向全社会全面开放,所有用户都可以体验这款AI大模型了。要比较这两个语言模型,我们先设计好题目。 第一个考验,语义理解 题目1&…

【韩顺平】Linux基础

目录 1.网络连接三种方式 1.1 桥接模式:虚拟系统可以和外部系统通讯,但是容易造成IP冲突【1-225】 1.2 NAT模式:网络地址转换模式。虚拟系统可以和外部系统通讯,不造成IP冲突。 1.3 主机模式:独立的系统。 2.虚拟机…

Java 多线程系列Ⅵ(并发编程的六大组件)

JUC 组件 前言一、Callable二、ReentrantLock三、Atomic 原子类四、线程池五、Semaphore六、CountDownLatch 前言 JUC(Java.util.concurrent)是 Java 标准库中的一个包,它提供了一组并发编程工具,本篇文章就介绍几组常见的 JUC 组…

【送书活动】揭秘分布式文件系统大规模元数据管理机制——以Alluxio文件系统为例

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

C++-map和set

本期我们来学习map和set 目录 关联式容器 键值对 pair 树形结构的关联式容器 set multiset map multimap 关联式容器 我们已经接触过 STL 中的部分容器,比如: vector 、 list 、 deque 、forward_list(C11)等,这些容器统称为序列式…

【Ubuntu搭建MQTT Broker及面板+发布消息、订阅主题】

Ubuntu搭建MQTT Broker及面板发布消息、订阅主题 配置curl数据源 curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash开始安装 sudo apt-get install emqx启动 sudo emqx start使用面板 根据自己的服务器是否开始了防火墙放行端口(1808…

YOLO目标检测——火焰烟雾数据集+已标注VOC和YOLO格式标签下载分享

实际项目应用:火灾预警系统、智能监控系统、工业安全管理、森林火灾监测以及城市规划和消防设计等应用场景中具有广泛的应用潜力,可以提高火灾检测的准确性和效率,保障人员和财产的安全。数据集说明:YOLO火焰目标检测数据集&#…

合宙Air724UG LuatOS-Air LVGL API控件-截屏(Screenshots)

截屏(Screenshots) 分 享导出pdf 截屏功能,core版本号要>3211 示例代码 -- 创建图片控件img lvgl.img_create(lvgl.scr_act(), nil)-- 设置图片显示的图像lvgl.img_set_src(img, "/lua/test.png")-- 图片居中lvgl.obj_align(…

Kafka入门与安装

为什么要用消息中间件? 异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式。 串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注…

elementUI时间选择器

<template>//月选择器//:clearable"false" 去掉<div class"monthCard"><el-date-picker:clearable"false"v-model"monthValue"type"month"placeholder"选择月"change"handleChangeMonth($eve…

vue3笔记

vue3笔记 vue3官网 尚硅谷视频 黑马视频 ## vue3的main.js 1.vue3 import { createApp } from vue // 引入createApp方法 import App from ./App.vue // 引入App根组件 createApp(App).mount(#app) // 创建一个 Vue 实例&#xff0c;并将其挂载到 id 为 "app" 的 …

静态工厂模式,抽象工厂模式,建造者模式

静态工厂模式 ublic class FruitFactory {public static Fruit getFruit(String name) {Fruit fnull;switch (name){case "APPLE":{fnew Apple();}case "BANANA":{fnew Banana();}default :{System.out.println("Unknown Fruit");}}return f;} …

RabbitMQ 知识点解读

1、AMQP 协议 1.1、AMQP 生产者的流转过程 当客户端与Broker 建立连接的时候&#xff0c;会调用factory .newConnection 方法&#xff0c;这个方法会进一步封装成Protocol Header 0-9-1 的报文头发送给Broker &#xff0c;以此通知Broker 本次交互采用的是AMQPO-9-1 协议&…

算法:数组中的最大差值---“打擂台法“

文章来源&#xff1a; https://blog.csdn.net/weixin_45630258/article/details/132737088 欢迎各位大佬指点、三连 1、题目&#xff1a; 给定一个整数数组 nums&#xff0c;找出给定数组中两个数字之间的最大差值。要求&#xff0c;第二个数字必须大于第一个数字。 2、分析特…

【Docker】容器化应用程序的配置管理策略与实践

一、引言 1.1 Docker的背景和优势 Docker是一种开源的容器化平台&#xff0c;简化应用程序的打包、交付和运行过程。基于Linux容器技术&#xff0c;通过提供一个轻量级、可移植和自包含的容器来实现应用程序的隔离和部署。 在传统的应用程序开发和部署中&#xff0c;往往需要…

Vue2项目练手——通用后台管理项目第七节

Vue2项目练手——通用后台管理项目 用户管理分页使用的组件Users.vuemock.js 关键字搜索区Users.vue 权限管理登录页面样式修改Login.vue 登录权限使用token对用户鉴&#xff0c;使用cookie对当前信息保存&#xff08;类似localstorage&#xff09;Login.vuerouter/index.js 登…

pyqt5设置背景图片

PyQt5设置背景图片 1、打开QTDesigner 创建一个UI&#xff0c;camera.ui。 2、创建一个pictures.qrc文件 在ui文件同级目录下先创建一个pictures.txt&#xff0c;填写内容&#xff1a; <RCC><qresource prefix"media"><file>1.jpg</file>…

【Python】conda虚拟环境下使用pyinstaller打包程序为exe

文章目录 一、为什么要用conda虚拟环境二、pyinstaller用法2.1 安装 PyInstaller2.2 基本用法打包一个 Python 脚本2.21 打包一个 Python 项目2.22 打包选项 2.3 打包依赖项2.31 导出依赖项列表2.32 配置依赖项 2.4 自定义打包选项2.5 打包完成后的文件2.6 注意事项 三、打包示…

解决外接显示器后Edge浏览器地址栏等变得很大的问题

解决外接显示器后Edge浏览器地址栏等变得很大的问题 edge设置里外观——触控模式&#xff0c;把触控模式关了

Kafka详解

目录 一、消息系统 1、点对点的消息系统 2、发布-订阅消息系统 二、Apache Kafka 简介 三、Apache Kafka基本原理 3.1 分布式和分区&#xff08;distributed、partitioned&#xff09; 3.2 副本&#xff08;replicated &#xff09; 3.3 整体数据流程 3.4 消息传送机制…