操作系统入门 -- 设备管理

操作系统入门 – 设备管理

1.设备控制器

1.1 意义

电脑本身可以外接多个输入输出设备,如键盘、鼠标、显示器等。由于这些设备的功能和特性不同,但是又需要由操作系统同一管理。为了屏蔽每个设备之间的差异,引入了设备控制器。设备控制器是CPU与其他外围硬件进行通信和操作的工具。其大致可以分为状态寄存器、命令寄存器和数据寄存器。

1.2 寄存器的功能

  • 数据寄存器:CPU向I/O设备写入需要传输的数据。
  • 命令寄存器:CPU向I/O设备发送的执行指令,告知I/O需要执行什么操作。
  • 状态寄存器:告知CPU设备的工作状态。

1.3 输入输出

在计算机中,输入输出可以分为 块设备字符设备

  • 块设备:把数据存储在固定大小的块中,每个块有自己的地址。例如硬盘、USB就是块设备。
  • 字符设备:以字符为单位发送或接收一个字符流,字符设备时无法寻址的,也没有寻道操作。例如鼠标。

2.I/O控制方式

2.1 控制方式

之前我们有了解过,外围设备在执行操作时会采用中断的方式请求系统资源,但是中断对于频繁读写数据的硬盘来说就不太适合,会占用CPU大量时间。因此引入DMA功能。DMA功能可以保证设备在CPU不参与的情况下,自行完成把I/O数据放入内存。本节着重了解DMA

2.1 DMA工作方式

    1. CPU需要多DMA下发指令,告知读取数据的大小和读取完毕后数据存放位置。
    1. 此时DMA会向磁盘控制器发出指令,通知磁盘读取数据到内部缓冲区,之后磁盘控制器将缓冲区数据传入内存。
    1. 数据传输完成后,磁盘控制器在总线上发出一个确认成功的信号到DMA控制器中。
    1. DMA收到信号后会使用中断通知CPU。

从上述流程中可以看到,当CPU想要获取外围硬件中的数据时,只需向DMA发送指令即可,当外围硬件数据处理完成后会由DMA通知CPU,避免了数据频繁交换时对CPU的中断。


3.设备驱动器

3.1 意义

设备控制器能够屏蔽许多问题,但不懂控制器的寄存器、缓冲区都是不一样的。为了消除其间的差异,引入设备驱动器的概念

3.2 区别

设备控制器时存在余外围设备的硬件上,而设备驱动器则是操作系统中的一部分。设备驱动器将会提供统一接口给操作系统,因此不同的设备驱动程序就可以以相同方式接入操作系统。

3.3 处理方式

前文中提到设备完成指令后会产生中断,而中断响应的地方就是设备驱动器中。它会及时响应控制器发来的中断请求,并根据这个中断的类型调用响应的中断处理程序进行处理。中断处理流程如下:

    1. 在 I/O 时,设备控制器如果已经准备好数据,则会通过中断控制器向 CPU 发送中断请求;
    1. 保护被中断进程的 CPU 上下文;
    1. 转入相应的设备中断处理函数;
    1. 进行中断处理;
    1. 恢复被中断进程的上下文;

4.通用块层

4.1 意义

在Linux中为避免不同块层设备之间造成的不同影响,使用通用块层来解决这一问题。简单来说通用块层是处于文件系统和磁盘驱动中间的一个块设备抽象层。

4.2 功能

  • 向上为文件系统和应用程序,提供访问块设备的标准接口,向下把各种不同的磁盘设备抽象为统一的块设备,并在内核层面,提供一个框架来管理这些设备的驱动程序;
  • 通用层还会给文件系统和应用程序发来的 I/O 请求排队,接着会对队列重新排序、请求合并等方式,也就是 I/O 调度,主要目的是为了提高磁盘读写的效率。

5.存储系统I/O软件分层

5.1 分层

在Linux中可以将存储系统的 I/O 由上到下可以分为三个层次,分别是文件系统层、通用块层、设备层。其作用如下:

  • 文件系统层,包括虚拟文件系统和其他文件系统的具体实现,它向上为应用程序统一提供了标准的文件访问接口,向下会通过通用块层来存储和管理磁盘数据。
  • 通用块层,包括块设备的 I/O 队列和 I/O 调度器,它会对文件系统的 I/O 请求进行排队,再通过 I/O 调度器,选择一个 I/O 发给下一层的设备层。
  • 设备层,包括硬件设备、设备控制器和驱动程序,负责最终物理设备的 I/O 操作

6.例子 ———— 键盘输入

CPU 里面的内存接口,直接和系统总线通信,然后系统总线再接入一个 I/O 桥接器,这个 I/O 桥接器,另一边接入了内存总线,使得 CPU 和内存通信。再另一边,又接入了一个 I/O 总线,用来连接 I/O 设备,比如键盘、显示器等。

那当用户输入了键盘字符,键盘控制器就会产生扫描码数据,并将其缓冲在键盘控制器的寄存器中,紧接着键盘控制器通过总线给 CPU 发送中断请求。

CPU 收到中断请求后,操作系统会保存被中断进程的 CPU 上下文,然后调用键盘的中断处理程序。
键盘的中断处理程序是在键盘驱动程序初始化时注册的,那键盘中断处理函数的功能就是从键盘控制器的寄存器的缓冲区读取扫描码,再根据扫描码找到用户在键盘输入的字符,如果输入的字符是显示字符,那就会把扫描码翻译成对应显示字符的 ASCII 码,比如用户在键盘输入的是字母 A,是显示字符,于是就会把扫描码翻译成 A 字符的 ASCII 码。

得到了显示字符的 ASCII 码后,就会把 ASCII 码放到「读缓冲区队列」,接下来就是要把显示字符显示屏幕了,显示设备的驱动程序会定时从「读缓冲区队列」读取数据放到「写缓冲区队列」,最后把「写缓冲区队列」的数据一个一个写入到显示设备的控制器的寄存器中的数据缓冲区,最后将这些数据显示在屏幕里。

显示出结果后,恢复被中断进程的上下文。

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

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

相关文章

JavaScript进阶(四)---js解构

目录 一.定义: 二.类型: 1.数组解构: 1.1变量和值不匹配的情况 1.2多维数组 2.对象解构 3.对象数组解构 4.函数参数解构 5.扩展运算符 一.定义: JavaScript 中的解构(Destructuring)是一种语法糖&…

Spring Web MVC入门(2)(请求1)

目录 请求 1.传递单个参数 2.传递多个参数 3.传递对象 4.后端参数重命名(后端参数映射) 非必传参数设置 5.传递数组 请求 访问不同的路径就是发送不同的请求.在发送请求时,可能会带一些参数,所以学习Spring的请求,主要是学习如何传递参数到后端及后端如何接收. 1.传递单…

Java时间复杂度介绍以及枚举

时间复杂度 从小到大&#xff1a; O(1) 常数阶。复杂度为O(1)与问题规模无关 线性阶 O&#xff08;n&#xff09;比如一个for循环中代码执行n遍 n阶 对数阶 int n9; int i1; while(i<n) { i*2; } 2^x>n时候退出。次数xlog2^n 时间复杂度为O(logN) 根号阶 int…

OpenGL笔记十之Shader类的封装

OpenGL笔记十之Shader类的封装 —— 2024-07-10 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十之Shader类的封装1.运行2.目录结构3.main.cpp4.application4.1.CMakeLists.txt4.2.Application.h4.3.Application.cpp 5.assets5.1.shaders&#xf…

Hive及其架构简介

什么是 Hive &#xff1f; 一个基于 Hadoop 的数据仓库&#xff0c;适用于一些高延迟性的应用&#xff08;离线开发&#xff09;&#xff0c;可以将存储在 Hadoop 文件中的结构化、半结构化数据文件映射为一张数据库表&#xff0c;并基于表提供类似 SQL 的查询模型&#xff0c…

可移植性和跨平台性,你能分得清吗?

可移植性和跨平台性&#xff0c;你能分得清吗&#xff1f; 当你听到这两个名词&#xff0c;你能清楚的区分他们吗&#xff1f; 可移植性 > 环境 跨平台性 > 平台 首先先弄懂环境和平台的区别&#xff0c;环境是平台&#xff1f;平台就是环境&#xff1f; 平台&#x…

前一段时间比较火的刷网课平台源码,带数据库和教程

前一段时间比较火的刷网课平台源码&#xff0c;带数据库和教程。 好在疫情已经结束了&#xff0c;希望今后世上再无网课。 这个代码免费提供给大家学习开发用吧&#xff0c;作为一个php的入门学习案例用用还可以。 使用办法 网站根目录解压 打开nginx.htaccess文件&#x…

3.4、matlab实现SGM/BM/SAD立体匹配算法计算视差图

1、matlab实现SGM/BM/SAD立体匹配算法计算视差图简介 SGM&#xff08;Semi-Global Matching&#xff09;、BM&#xff08;Block Matching&#xff09;和SAD&#xff08;Sum of Absolute Differences&#xff09;都是用于计算立体匹配&#xff08;Stereo Matching&#xff09;的…

Contact Form联系表单自动发送邮件(超级简单)

前几天发现了aoksend推出的这个联系表单的组件&#xff0c;非常好用&#xff0c;只有一个php文件&#xff0c;把php文件放到网站主目录里面。然后去aoksend注册和配置好域名和发信邮箱&#xff0c;可以得到发送密钥&#xff1a;app_key&#xff0c;然后配置好邮件模板&#xff…

go 密码hash加密包 bcrypt

1.明文密码一般都会通过一套算法转成一条长长的字符串&#xff0c;密码验证这需要通过验证明文和加密字符串是否对应 2.go 有现成的hash算法包 "golang.org/x/crypto/bcrypt" 一般我们有一个工具包utils &#xff0c;在工具里封装两个方法即可&#xff0c; 即 明文…

数据库内核研发学习之路(二)postgres编译安装

我们在前面安装配置好环境之后&#xff0c;接下来就是去安装编译postgres&#xff0c;不是以前我们常用的一键化安装&#xff0c;而是根据源码进行编译安装。 1、获取postgres的15.2版本的源码 我这里获取的是15.2版本的源码&#xff0c;当然大家也可以获取其他版本的源码&am…

百度安全大模型智能体实践入选信通院“安全守卫者计划”优秀案例

7月3日&#xff0c;由全球数字经济大会组委会主办&#xff0c;中国信息通信研究院&#xff08;以下简称中国信通院&#xff09;与中国通信标准化协会联合承办的2024全球数字经济大会“云和软件安全论坛暨第二届SecGo云和软件安全大会”在北京召开。本届论坛聚焦云和软件安全最新…

Java学习笔记整理: 关于SpringBoot 2024/7/12;

SpringBoot springboot也是spring公司开发的一款框架。为了简化spring项目的初始化搭建的。 特点specialty&#xff1a; springboot的特点: 1&#xff09; 自动配置 Spring Boot的自动配置是一个运行时&#xff08;更准确地说&#xff0c;是应用程序启动时&#xff09;的过程&a…

Java中常用的util类库在Maven

Java中常用的util类库在Maven项目中通常以依赖的形式引入。以下是一些常用的util库及其Maven依赖。 Apache Commons Lang 3: 提供了很多工具类&#xff0c;如StringUtils, ArrayUtils等。 <dependency><groupId>org.apache.commons</groupId><artifactI…

new Date() 是 JavaScript 中用来创建日期和时间对象的构造函数。它能够生成当前日期和时间,或者根据提供的参数生成特定的日期和时间对象

new Date() 是 JavaScript 中用来创建日期和时间对象的构造函数。它能够生成当前日期和时间&#xff0c;或者根据提供的参数生成特定的日期和时间对象。以下是关于 new Date() 的详细说明&#xff0c;包括如何使用不同参数来创建日期对象以及如何操作日期对象。 创建 Date 对象…

RISC-V在线反汇编工具

RISC-V在线反汇编工具&#xff1a; https://luplab.gitlab.io/rvcodecjs/#q34179073&abifalse&isaAUTO 不过&#xff0c;似乎&#xff0c;只支持RV32I、RV64I、RV128I指令集&#xff1a;

ControlNet作者新作Paints-Undo:一键模拟人类绘画过程,再也没人敢说你的图是生成的了!

ControlNet作者敏神又有新项目了。 Paints-Undo 可以生成模拟人类绘画过程的动画。支持输入单图倒推出绘制这个图片某一步的过程&#xff0c;也可以给两张图&#xff0c;生成一个绘制过程动画。 再有人说你的图是生成的就把这个拿给他看&#xff0c;哈哈。下面先看一下展示的…

【JUC】使用CompletableFuture执行异步任务

文章目录 Future接口介绍Future接口常用实现类FutureTaskFuture接口能干什么Future接口相关架构FutureTask初步使用Future编码实战和优缺点分析优点缺点获取结果的方式不优雅结论 完成一些复杂的任务 CompletableFuture对Future的改进CompletableFuture为什么会出现Completable…

解决nginx代理静态资源刷新后404问题

背景 在公司的项目中&#xff0c;有一个管理系统&#xff0c;大致的逻辑是通过nginx代理的静态资源&#xff0c; 正常页面跳转是没有问题的&#xff0c;有的时候我们会使用回车或者F5进行 页面刷新的时候都会出现404问题。 解决 这种我怀疑是nginx的配置不到位的问题。 我在本…

数据库管理-第218期 服务器内存(20240711)

数据库管理218期 2024-07-11 数据库管理-第218期 服务器内存&#xff08;20240711&#xff09;1 内存2 ECC内存3 原理3.1 多副本传输3.2 纠错码3.3 汉明码 总结 数据库管理-第218期 服务器内存&#xff08;20240711&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文…