【面试心得】系统调用

这个问题也是在九识面试的时候被问到的,当时我说就是像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.mzph.cn/news/74558.shtml

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

相关文章

车载诊断数据库——诊断问卷调查表与CDD关联关系

车载诊断数据库——诊断问卷调查表与CDD关联关系 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生…

typeScript 学习笔记(二)

类接口 TypeScript 入门教程 (xcatliu.com) 十四.类 ① 类 类:定义了一件事物的抽象特点,包含它的属性和方法对象:类的实例,通过new生成面向对象(OOP)的三大特性:封装、继承、多态封装&…

【代表团坐车】Python 实现-附ChatGPT解析

1.题目 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车,可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案,输出方案数量。 约束: 1.一个团只能上一辆车,并且代表团人数(代表团数量小于30,每人代表团人数小于30)小于汽车容量…

LAMP搭建WordPress

L linux A apache hhtpd M mysql/maridb P PHP1、 安装php yum -y install php php-fpm php-server php-mysql1.1、 启动php-fpm并自启 systemctl enable php-fpm --now[rootecs-1cee ~]# systemctl status php-fpm ● php-fpm.service - The PHP FastCGI Process ManagerLoa…

VPP以太网接口模式

以太网接口结构ethernet_interface_t如下,其成员flags为32bit,高16bit为运行状态标志,低16bit为操作标志。最低bit位表示接口的L2/L3模式设置。第16bit为1表示接口运行在L3模式。 /* Ethernet interface instance. */ typedef struct ethern…

muduo 32 muduo项目总结

Timestamp时间管理类 ①:主要提供now函数显示当前时间:自1970年1月1日0点以来经过的秒数,使用time函数 ②: toString函数将字符串转化成时间字符串,使用localtime函数将秒数格式化成日历时间 解析tm_time 并以日历格…

计算机毕业设计 JSPM校园闲置物品交易平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

【C++模拟实现】手撕AVL树

【C模拟实现】手撕AVL树 目录 【C模拟实现】手撕AVL树AVL树的介绍(百度百科)AVL树insert函数的实现代码验证是否为AVL树AVL树模拟实现的要点易忘点AVL树的旋转思路 作者:爱写代码的刚子 时间:2023.9.10 前言:本篇博客将…

Nodejs 第十五章(child_process)

child_process 子进程 子进程是Nodejs核心API,如果你会shell命令,他会有非常大的帮助,或者你喜欢编写前端工程化工具之类的,他也有很大的用处,以及处理CPU密集型应用。 创建子进程 Nodejs创建子进程共有7个API Sync…

跟踪源码技巧+阅读源码工具Sourcetrail

基于Eclipse IDE 1、Quick Type Hierarchy 快速查看类继承体系 ( 快捷键:Ctrl T) 查看类很多人可能都知道,可源码阅读的时候更多用来查看方法体系更重要,可以方便快速的定位到方法的实现类。如: 此时如…

Kafka入门与安装

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

无涯教程-JavaScript - COUPDAYSNC函数

描述 COUPDAYSNC函数返回从结算日期到下一个息票日期的天数。 语法 COUPDAYSNC (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 RequiredMaturity 证…

elk安装篇之 Kibana安装

Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。是es的可视化客户端之一。 一:下载 https://www.elastic.co/cn/kibana 我的es是elasticsearch-7.10.2版本&#x…

javascript中如何将多个数组的一个元素相加求和

三个数组第一个元素相加并输出 在JavaScript中,通过以下方式将这三个数组的每个数组的第一个元素相加并输出: let array1 [1,2,3]; let array2 [3,4,5]; let array3 [5,6,7];let sum array1[0] array2[0] array3[0]; console.log(sum);这段代码首…

Hilbert-Schmidt Operator

Hilbert-Schmidt Operator See https://mathworld.wolfram.com/Hilbert-SchmidtOperator.html See https://people.kth.se/~laptev/FA08/l8.pdf

OpenCV(二十九):图像腐蚀

1.图像腐蚀原理 腐蚀操作的原理是将一个结构元素(也称为核或模板)在图像上滑动,并将其与图像中对应位置的像素进行比较。如果结构元素的所有像素与图像中对应位置的像素都匹配,那么该位置的像素值保持不变。如果结构元素的任何一个…

[通用]计算机经典面试题基础篇Day3

[通用]计算机经典面试题基础篇Day3 1、请说明mysql的两种主要引擎 MySQL有多种存储引擎,但最常见的两种主要引擎是InnoDB和MyISAM。 2、说一下mysql这两种引擎的使用场景 MySQL的两种主要引擎,InnoDB和MyISAM,各自适用于不同的使用场景&…

利用python进行视频下载并界面播放快速下载素材

工具:python designer(python自带):UI界面设计工具 VLC:视频播放工具 需要的库如下: import os,platform os.environ[PYTHON_VLC_MODULE_PATH] "./vlc-3.0.14" import vlc from 脚本 import Player from …

通过位运算打多个标记

通过位运算打多个标记 如何在一个字段上,记录多个标记? 如何在一个字段上,记录不同类型的多个标记? 如何用较少的字段,记录多个标记? 如何在不增加字段的要求下,记录新增的标记? 在实…

Oracle数据库连接之TNS-03505_无法解析服务名异常

在进行数据库开发的时候,通常需要连接Oralce数据库,在进行连接时,经常性的会提示TNS-03505: Failed to resolve name(无法解析服务名),从而导致无法连接到数据库实例,那么通过本文对造成该问题的…