Lesson3 - 操作系统软件视角和系统调用

news2024/11/24 14:31:19

文章目录

  • 硬件支持系统 系统管理硬件
  • 异步行为
    • 中断的分类
  • 同步行为
  • 虚拟地址空间
  • shell
  • 系统调用与软中断
    • 区分系统调用
    • trace 命令


硬件支持系统 系统管理硬件

计算机硬件由三样东西组成:CPU、内存、I/O设备。为了更有效地管理这些硬件资源,系统设计者引入了抽象的概念,其中最为核心的三大抽象便是进程、虚拟内存与文件

在这里插入图片描述

  • 将磁盘和I/O设备抽象成文件,统一由对应文件来访问对应设备。
  • 将内存与文件统一规划为虚拟地址空间来屏蔽了下层细节。
  • 最后将CPU资源与虚拟地址封装给进程,为进程服务。

异步行为

在这里插入图片描述

异步分为两种:软件异步和硬件异步。他们的流程都是一样的。

当程序正在执行时,发生了一个错误导致未能正常运行,这个就叫中断

  • a.1:中断来临时,第一件事就是保护现场。主要是三样东西:
    • PC指针:必须由硬件(CPU)来做,因为如果用软件做的话,PC值已经跳转到软件的地址,而非中断地址。
    • PSW寄存器:由于在跳转时PSW数据不会改变,所以由OS来做。
    • 基础寄存器:同样由OS做。
    • 现在的CPU也将PSW和基础寄存器的保护一并做了。
  • a.2:中断向量表
    • 根据不同的中断信息,查表找到对应的中断处理函数的入口。
    • 这个表由OS来制定,不同的系统有不同的表。
    • 现在的部分CPU也可以提供这个表。
  • a.3:中断处理函数
    • 由OS准备。
  • a.4:中断返回
    • 区别于普通函数的返回(例如C的return),这个返回需要我们将数据重新写回寄存器,还原现场,显然普通返回做不到,所以就有了特定的汇编语言写的返回。
    • 这个返回由OS来写。
    • 现在的部分CPU也能做。

中断的分类

中断分两类:

  • 程序主动发出的中断:异常处理
    • 由程序写死的,固定发生的情况。
    • 例如:
      • int a = 10 / 0;
      • 系统调用,访问内存缺页的情况。
  • 硬件被动发生的中断:外部中断
    • 由外部设备或系统硬件主动向CPU发出的中断信号,无法预测什么时候发生的事件。

同步行为

在这里插入图片描述
同步就是程序的顺序执行过程。

  • func1()开始执行:
    • 栈中记录下a, b的数据。
    • 保护数据(PC、PSW、普通寄存器)
  • 跳转到a1():
    • 记录x1, x2数据。
    • 执行完毕。
  • 函数返回:
    • 普通函数数据保护(共两样):
      • PC值:
        • 之前压栈保存,现在将无关数据弹栈,直到发现指令地址,将其赋给PC。
        • 同样,因为PC值会变,所以由硬件来进行保护。
      • 基础寄存器:
        • 因为是应用程序,所以由 编译器 进行保护。
      • PSW :
        • 用不到之前的状态,不需要保护。

虚拟地址空间

在这里插入图片描述

从操作系统层级上看,虚拟地址空间主要分为两个部分内核区和用户区。

  • 内核区:
    • 常驻内存,是操作系统的一部分。
  • 用户区(内存四区):
    • 代码区(.text):通常用于存放程序的执行代码(即CPU执行的机器指令),代码段一般情况下是只读的,这是对执行代码的一种保护机制。
    • 数据区(.data):存放程序中已初始化且初值不为0的全局变量和静态变量。数据段属于静态内存分配(静态存储区),可读可写。
    • 堆区(.heap):存放运行时动态申请的内存,由程序员管控。
      • 堆中内容是匿名的,不能按名字直接访问,只能通过指针间接访问。
      • 堆向高地址扩展(即“向上生长”),是不连续的内存区域。这是由于系统用链表来存储空闲内存地址,自然不连续,而链表从低地址向高地址遍历。
    • 栈区(.stack):存放局部变量,由编译器管控。
      • 跟堆区相反,内存向下生长,内存连续。

更多详细内容:文件描述符 - 1.2 分区


shell

在这里插入图片描述
shell是封装在OS之上的一种软件,提供了一系列指令给操作者来对OS进行操作。


系统调用与软中断

在这里插入图片描述
程序在执行时,会有对硬件进行操作的需求,但是程序在用户空间执行,不能直接对内核区的硬件进行操作,所以就需要系统调用帮忙。

  • 系统调用是用汇编语言写的指令,封装成接口供程序使用。
  • 调用系统调用时,进行了模式的切换
    • 主动放弃用户模式,转而进入内核模式执行某些特权操作。
  • 软中断
    • 软中断是由用户程序主动触发的,与硬件中断不同。
    • 在调用系统调用时,程序通常会触发一个软中断(如使用INT指令),这会中断当前的程序执行,将控制权转移到操作系统的内核。

区分系统调用

那么多系统调用,如何分辨要执行哪一个呢?

  • 在软中断信号中,含有号码,这个号码CPU不进行解析,CPU只读取到这是软中断,然后交由OS解析,OS根据号码执行对应的系统调用。

trace 命令

trace ./a,out

追踪执行程序时使用的系统调用。

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

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

相关文章

ElasticSearch备考 -- Search template

一、题目 ### 基础版 Create a search template for the above query, so that the template (i) is named "with_response_and_tag", (ii) has a parameter "with_min_response" to represent the lower bound of the response field, (iii) has a parame…

分治算法(3)_快速选择_数组中的第K个最大元素

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 分治算法(3)_快速排序_数组中的第K个最大元素 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论&#…

SSH -L 代理与反向代理转发详解

简介:SSH -L 选项用于设置本地端口转发,而反向代理转发则允许远程主机访问本地服务。本文将介绍如何使用 SSH -L 实现本地端口转发和反向代理转发,并提供示例以帮助您理解和应用这些技术。 历史攻略: Centos:设置代理…

国庆假期结束

🔚 推迟几天返校 未提前和老师商量(其实放假前我也说过的,但是我导可能忘记了) 我的确有错,事情总自己觉得行了就觉得可以了 在老师看起来的确有点“不尊重” 下次一定要要要注意⚠️⚠️⚠️ 上次,国…

【Kubernetes】常见面试题汇总(五十九)

目录 129.问题:pod 使用 PV 后,无法访问其内容? 130.查看节点状态失败? 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二&#xf…

大语言模型 LLM 量化技术略解

什么是量化? 随着语言模型规模的不断增大,其训练的难度和成本已成为共识。而随着用户数量的增加,模型推理的成本也在不断攀升,甚至可能成为限制模型部署的首要因素。因此,我们需要对模型进行压缩以加速推理过程,而模型量化是其中一种有效的方法。 大语言模型的参数通常…

Python运行态 - 代码调试:掌握pdb

简介:pdb(Python Debugger)是 Python 标准库中的调试工具,旨在帮助开发者在代码中设置断点、检查变量值和逐行执行代码。这对于定位和修复程序中的问题至关重要。pdb 是 Python 的内置模块,因此不需要额外安装。 历史…

20款奔驰CLS300升级原厂抬头显示HUD 23P智能辅助驾驶 触摸屏人机交互系统

以下是为您生成的一份关于 18 款奔驰 CLS 老款改新款的改装文案: 18 款奔驰 CLS 老款改新款:科技升级,畅享极致驾驶体验 在汽车改装的世界里,每一次的升级都是对卓越的追求。今天,让我们一同探索 18 款奔驰 CLS 老款改…

Leetcode—152. 乘积最大子数组【中等】

2024每日刷题&#xff08;174&#xff09; Leetcode—152. 乘积最大子数组 C实现代码 class Solution { public:int maxProduct(vector<int>& nums) {int n nums.size();int mx nums[0];int mn nums[0];int ans mx;for(int i 1; i < n; i) {const int prem…

贪心算法c++

贪心算法C概述 一、贪心算法的基本概念 贪心算法&#xff08;Greedy Algorithm&#xff09;&#xff0c;又名贪婪法&#xff0c;是一种解决优化问题的常用算法。其基本思想是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部最优的决…

基于yolov8的200鸟类智能检测与识别系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的200种鸟类智能检测与识别系统是一款基于深度学习的目标检测系统&#xff0c;该系统利用YOLOv8框架&#xff0c;通过11788张图片训练出一个能够进行鸟类智能检测与识别的模型&#xff0c;可以识别200种不同的鸟类。 该系统采用Python与PyQt5开发&…

苹果电脑磁盘满了怎么清理内存?必看清理秘籍

对于很多Mac用户来说&#xff0c;随着时间的推移&#xff0c;电脑逐渐变慢并出现磁盘空间不足的提示是一件非常头疼的事情。正确理解内存和存储的区别&#xff0c;并采用有效的清理方法&#xff0c;对于保持Mac性能至关重要。本文将深入探讨如何有效清理Mac上的磁盘空间&#x…

一文看懂计算机中的大小端(Endianess)

文章目录 前言一、什么是大小端二、如何判断大小端三、大小端的转换3.1 使用标准库函数3.2 手动实现大小端转换 前言 本文主要探讨计算机中大小端的相关概念以及如何进行大小端的判断和转换等。 一、什么是大小端 大小端&#xff08;Endianess&#xff09;是指计算机系统在存…

CentOS7安装宝塔

第一步&#xff1a;安装 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh安装成功后会弹出这个页面 那么下次怎样再次打开这个页面呢&#xff1f; 输入这个&#xff1a; /etc/init.d/bt default…

YOLO v1详解解读

&#x1f680; 在此之前主要介绍了YOLO v5源码的安装和使用&#xff08;YOLO v5安装教程&#xff09;&#xff0c;接下来将探索YOLO的实现原理&#xff0c;作为一个金典的单阶段目标检测算法&#xff0c;应该深度的理解它的构建思想&#xff1b;所以本系列文章将从LOVO v1出发到…

JavaEE: 深入解析HTTP协议的奥秘(1)

文章目录 HTTPHTTP 是什么HTTP 协议抓包fiddle 用法 HTTP 请求响应基本格式 HTTP HTTP 是什么 HTTP 全称为"超文本传输协议". HTTP不仅仅能传输文本,还能传输图片,传输音频文件,传输其他的各种数据. 因此它广泛应用在日常开发的各种场景中. HTTP 往往是基于传输层的…

PCIe配置篇(0)——地址空间

一、地址空间回顾 在最开始&#xff0c;我们先来回顾一下PCIe的一些基本概念&#xff0c;首先&#xff0c;PCIe是PCI的延伸&#xff0c;全名叫 Peripheral Component Interface Express。从名字就能看出&#xff0c;这是一种外设总线协议。在整个系统中&#xff0c;外设只是其中…

算法与程序课程设计——观光铁路

观光铁路 一、任务 跳蚤国正在大力发展旅游业&#xff0c;每个城市都被打造成了旅游景点。 许多跳蚤想去其他城市旅游&#xff0c;但是由于跳得比较慢&#xff0c;它们的愿望难以实现。这时&#xff0c;小C听说有一种叫做火车的交通工具&#xff0c;在铁路上跑得很快&#x…

C语言基础(10)之指针(2)

在上一篇文章中我们谈到了指针&#xff0c;并给老铁们讲解了什么是指针、指针类型、野指针以及指针运算等知识。在这篇文章中小编将继续带大家了解指针的相关知识点。 1. 指针和数组 指针和数组之间又能有什么联系呢&#xff1f;在谈这个之前&#xff0c;我们先来讲讲指针和数…

深入分析——为什么未初始化的全局变量是零?

1、前言 #include <stdio.h>int temp;int main(void) {//打印temp的值是零printf("temp%d\n", temp);return 0; }在C语言编程中&#xff0c;我们默认未初始化的全局变量、静态局部变量的初始化值都是零&#xff0c;底层原理如下 未初始化的全局变量、静态局部…