OS_过程调用与系统调用

news2025/2/3 22:58:49

2024.06.25:操作系统过程调用与系统调用学习笔记

第5节 过程调用与系统调用

  • 5.1 过程调用/函数调用/子程序调用
  • 5.2 系统调用
    • 5.2.1 系统调用汇编层
  • 5.3 过程调用与系统调用的对比


5.1 过程调用/函数调用/子程序调用

过程调用)也称为(函数调用)或(子程序调用),它允许程序代码被组织成(),每个块完成特定的任务,这些块可以在程序的多个地方调用。

在这里插入图片描述

过程调用既然是调用,那就一定会有一个(过程P:调用者caller)和一个(过程Q:被调用者callee


过程调用可以简单归纳总结成6步
在这里插入图片描述

  • P将入口参数放在Q能访问的到的地方

第一次:此时,P这里指的是main函数,Q指的是caller函数,如果被调用的这个函数Q是有参数的,那参数到底传给谁,是由调用者的函数决定的,因此调用者的函数应当将这个参数放在被调用的这个函数可以访问到的地方
第二次:caller函数应该把add需要用到的这些参数放到add函数可以访问到的地方,这个参数的值还是压到caller的栈帧中,注意add函数看似不访问caller的局部变量区,实际上它还是会有一些区域是这个add函数可以访问到的,它会被叫作(参数调用区)。我们现在会通过两个寄存器的中转,把这两个局部变量先复制到这两个寄存器中,然后再压回到caller的栈帧中(圈起来的区域是局部变量区,蓝色区域是参数调用区)在这里插入图片描述

  • P将返回地址存到特定的地方,然后将控制转移到Q

第一次:假设调用caller()函数的过程是main(),caller()函数没有参数,所以直接保存main函数的返回地址,控制转移到caller()在这里插入图片描述
第二次在这里插入图片描述

  • Q保存P的现场,并为自己的非静态局部变量分配空间
  • 被调用者caller应该去保存调用它的函数main函数它的现场,由于这个代码里面没有体现main函数,所以就不去考虑这个。
  • Q,也就是caller函数应该为自己的非静态局部变量去分配空间,比如这里的temp1,temp2,sum等

在这里插入图片描述
在这里插入图片描述

  • 执行Q的过程体

现在add这个函数的起始地址改到PC里面,这样我们就可以根据PC去执行add这个函数,add函数内部并没有什么含金量,就是直接去返回一个两个参数的求和,规定这个值一定会放在EAX这个寄存器中,通过中转把EAX这个结果写回到caller的栈帧中局部变量sum的这个位置在这里插入图片描述

  • Q恢复P的现场,并释放局部变量所占空间

add函数执行完之后会将结果放到EAX寄存器再复制到栈里面去,此时add函数调用已经结束了,然后add函数会执行ret指令,ret指令会做两件事情,首先它会让栈帧里面的这个返回地址出栈,出栈之后,返回地址弹出这个值写回PC里面,PC带领CPU回到caller函数,也就相当于caller的栈帧被清理了在这里插入图片描述

  • Q取出返回地址,将控制转移到P

主存里面有一个区域叫作堆栈(一个堆区、一个栈区),对于()来说,它的特性就是从高地址往低地址去增长的,并且它满足数据结构我们学过的这个栈的特性(先进后出)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


5.2 系统调用

系统调用的引用是因为用户程序想要去申请操作系统它的服务,操作系统的核心服务放在操作系统的内核部分,而操作系统内核常驻在内存的某一个区域中。

比如说你的一个用户进程想要去读写某个文件,这个用户进程其实是没有权限去执行这个指令的,关于所有的文件管理它都是由内核去进行的,所以此时必须要专区执行内核的代码。

但是我们知道CPU有两种工作状态,在用户态下去执行用户程序的时候,是没有办法去访问到操作系统的内核去代码,此时我们就需要CPU转到内核态,从而它就可以去访问到操作系统内核的代码,完成我们想要的操作,这个就是系统调用


系统调用既然需要CPU变态,那它就需要通过一个软中断指令,这个软中断并不会显示地出现在用户程序里
在这里插入图片描述


5.2.1 系统调用汇编层

在这里插入图片描述


5.3 过程调用与系统调用的对比

  1. 过程调用没有引发中断,而系统调用是通过发起一个软中断实现调用OS内核代码的
  2. 过程调用在调用时只需要保存PC而不需要保存PSW,而系统调用需要正常地进行(内部)中断处理,因此需要保存PC和PSW
  3. 过程调用全程CPU都处于同一个工作模式,即用户态或内核态,而系统调用会导致CPU从用户态切换内核态
  4. 过程调用的被调用函数会出现在代码中,而系统调用一个库函数即可实现,操作系统内核的代码不会出现在程序代码中
  5. 过程调用通过CALL或JMP指令进入,而系统调用通过INT或TRAP指令进入
  6. 过程调用是可以嵌套的,而系统调用一般不允许发生嵌套或递归

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

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

相关文章

SpringBoot框架下校园资料库的构建与优化

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…

【Conda】修复 Anaconda 安装并保留虚拟环境的详细指南

目录 流程图示1. 下载 Anaconda 安装程序2. 重命名现有的 Anaconda 安装目录Windows 操作系统Linux 操作系统 3. 运行新的 Anaconda 安装程序Windows 操作系统Linux 操作系统 4. 同步原环境使用 robocopy 命令(Windows)使用 rsync 命令(Linux…

CUDA与TensorRT学习四:模型部署基础知识、模型部署的几大误区、模型量化、模型剪枝、层融合

文章目录 一、模型部署基础知识1)FLOPS和TOPS定义介绍、计算公式(1)基础定义(2)计算公式(3)FLOPS在GPU试怎么运算?(4)Ampere SM的电子元件结构 2)…

【小沐学GIS】blender导入OpenTopography地形数据(BlenderGIS、OSM、Python)

文章目录 1、简介1.1 blender1.2 OpenStreetMap地图 2、BlenderGIS2.1 下载BlenderGIS2.2 安装BlenderGIS2.3 申请opentopography的key2.4 抓取卫星地图2.5 生成高度图2.6 获取OSM数据 结语 1、简介 1.1 blender https://www.blender.org/ Blender 是一款免费的开源 3D 创作套…

[uni-app]小兔鲜-07订单+支付

订单模块 基本信息渲染 import type { OrderState } from /services/constants import type { AddressItem } from ./address import type { PageParams } from /types/global/** 获取预付订单 返回信息 */ export type OrderPreResult {/** 商品集合 [ 商品信息 ] */goods: …

微信小程序地理定位与逆地址解析详解

地理定位 1 原理与思路 在微信小程序中,地理定位功能可以通过调用微信提供的API接口来实现。这些接口允许我们获取用户的当前位置或者让用户通过地图选择位置。获取到位置信息后,我们可以使用逆地址解析来获取详细的地址信息,如省、市、区、…

CUDA安装教程

文章目录 一、CUDA的下载和安装1.1 查看NVIDIA适配CUDA版本1.2 下载CUDA Toolkit1.3 安装CUDA 二、环境配置三、查看是否安装成功 一、CUDA的下载和安装 CUDA在深度学习中允许开发者充分利用NVIDIA GPU的强大计算能力来加速深度学习模型的训练和推理过程。 1.1 查看NVIDIA适配…

15分钟学 Python 第39天:Python 爬虫入门(五)

Day 39:Python 爬虫入门数据存储概述 在进行网页爬虫时,抓取到的数据需要存储以供后续分析和使用。常见的存储方式包括但不限于: 文件存储(如文本文件、CSV、JSON)数据库存储(如SQLite、MySQL、MongoDB&a…

多模态理论基础——什么是多模态?

文章目录 多模态理论1.什么是多模态(multimodal)2.深度学习中的多模态 多模态理论 1.什么是多模态(multimodal) 模态指的是数据或者信息的表现形式,如文本、图像、音频、视频等 多模态指的是数据或者信息的多种表现…

算法笔记(十)——队列+宽搜

文章目录 N 叉数的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度在每个树行中找最大值 BFS是图上最基础、最重要的搜索算法之一; 每次都尝试访问同一层的节点如果同一层都访问完了,再访问下一层 BFS基本框架 void bfs(起始点) {将起始点放入队列中;标记…

一款基于.NET开发的简易高效的文件转换器

前言 今天大姚给大家分享一款基于.NET开发的免费(GPL-3.0 license)、简易、高效的文件转换器,允许用户通过Windows资源管理器的上下文菜单来转换和压缩一个或多个文件:FileConverter。 使用技术栈 ffmpeg:作为文件转换…

vite学习教程03、vite+vue2打包配置

文章目录 前言一、修改vite.config.js二、配置文件资源/路径提示三、测试打包参考文章资料获取 前言 博主介绍:✌目前全网粉丝3W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&…

Python | Leetcode Python题解之第457题环形数组是否存在循环

题目: 题解: class Solution:def circularArrayLoop(self, nums: List[int]) -> bool:n len(nums)def next(cur: int) -> int:return (cur nums[cur]) % n # 保证返回值在 [0,n) 中for i, num in enumerate(nums):if num 0:continueslow, fas…

Qt中使用QPainter绘制阴影

困扰了很久的问题,今天终于明白了如何绘制QGraphicDropShadowEffect同样效果的阴影,故写下这篇文章分享给大家。其方法是复制Qt源代码中QGraphicDropShadowEffect绘制实现的核心代码然后稍作修改实现,先看效果和封装过后的源代码:…

在 Ubuntu 安装 Python3.7(没有弯路)

注:当前Ubuntu版本为18.04 下载Python源码包 wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz安装前准备 安装依赖组件 apt-get updateapt-get install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libs…

c++----多态(初识)

大家好,今天我们来讲讲我们c中的一个关键知识,叫做多态。但是我们学习多态之前必须将我们前面学习过的继承学习过后才能学习。当然大家可能会先想什么叫多态,我们从名字上上看的话就是多种姿态嘛。毕竟看起来这么容易理解,但其实也…

服务器conda环境安装rpy2

参考博客 https://stackoverflow.com/questions/68936589/how-to-select-r-installation-when-using-rpy2-on-conda 现在我遇到这样一个问题,服务器系统环境没有R(没有权限安装),我只能在minconda的conda环境中使用R, 使用方法如下 我现在…

Rocky Linux 9搭建K8s-1.28.0+docker一主多从集群测试环境

集群类型: Kubernetes集群大体上分为两类:一主多从和多主多从 一主多从:一台master节点和多台node节点,搭建简单,但是有单机故障风险,适用于测试环境 多主多从:多台master节点和多台node节点&am…

ELK日志收集之ES的DSL查询语句

一、简介 在Elasticsearch中,我们可以使用Elasticsearch-DSL(Elasticsearch Domain Specific Language)来构建和执行复杂的搜索查询。官方Query DSL指导文档。 叶查询:在特定字段中寻找特定值,例如 match ,term 或 range。 复合查询:具有查询…

【进阶OpenCV】 (5)--指纹验证

文章目录 指纹验证1. 验证原理2. 读取图片3. 计算特征匹配点 总结 指纹验证 指纹验证基于人类指纹的独特性和稳定性。每个人的指纹在图案、断点和交叉点上各不相同,这种唯一性和终生不变性使得指纹成为身份验证的可靠手段。指纹识别技术通过采集和分析指纹图像&…