启动项命令是什么(设备管理:操作系统 I/O 流程详解)

我们之前的文章提到了操作系统的三种抽象:进程、地址空间和文件。此外,操作系统还控制所有I/O设备。操作系统必须向设备发送命令,以捕捉中断并处理错误。它还应该在设备和操作系统的其余部分之间提供一个易于使用的接口。操作系统如何管理I/O是我们的下一个重点。

不同的人对I/O硬件有不同的理解。对于电子工程师来说,I/O硬件是组成硬件的芯片、电线、电源和其他物理设备。在程序员看来,I/O实际上是硬件提供给软件的接口,例如硬件接收的命令、执行的操作和反馈的错误。我们关注的是如何对硬件进行编程,而不是其工作原理。

I/O设备

什么是I/O设备?I/O设备也称为输入/输出设备。它是人类用来与计算机通信的外部硬件。输入/输出设备可以向计算机发送数据(输出)和从计算机接收数据(输入)。

I/O设备可分为两种类型:块设备和字符设备。

闭塞装置

块设备是一种可以存储固定大小信息的设备。它支持在固定大小的块、扇区或簇中读取和(可选)写入数据。每个块都有自己的物理地址。通常,块大小介于512和65536之间。所有传输的信息将以连续块的形式传输。块设备的基本特点是每个块相对相反,可以独立读写。常见的块设备包括硬盘、蓝光光盘和USB磁盘

这种设备通常比字符设备需要更少的引脚。

闭塞设备的缺点

基于给定固态存储器的块设备比基于相同类型存储器的字节寻址慢,因为读取或写入必须从块的开头开始。因此,要读取块的任何部分,必须找到块的开头,读取整个块,如果不使用块,则丢弃它。要写入块的一部分,必须找到块的开头,将整个块读入内存,修改数据,再次找到块的开头,然后将整个块写回设备。

免费获取更多Linux内核视频教程和文档。自己获取背景私信[kernel]。

内核学习网站:

Linux内核源代码/内存调整/文件系统/进程管理/设备驱动程序/网络协议栈-学习视频教程-腾讯教室

字符设备

另一种类型的I/O设备是字符设备。字符设备以字符为单位发送或接收字符流,与任何块结构无关。字符设备不可寻址,也没有任何寻道操作。常见字符设备包括打印机、网络设备、鼠标和大多数不同于磁盘的设备。

一些常用设备的数据速率如下所示:

设备控制器

首先,我们需要理解设备控制器的概念:

设备控制器是一个处理来自CPU的输入和输出信号的系统。设备通过插头和插座连接到计算机,插座连接到设备控制器。设备控制器从连接的设备接收数据,并将其存储在控制器内部的一些专用寄存器中,即本地缓冲区。

顾名思义,专用寄存器是为任务设计的寄存器。例如,CS、DS、GS和其他段寄存器是专用寄存器,因为它们的存在是为了保存段号。Eax、ECX等是通用寄存器,因为您可以不受限制地使用它们。例如,您不能移动DS,但可以移动eax和ebx。

  • 通用寄存器,如eax、ECX、EDX、ebx、ESI、EDI、EBP和esp
  • 特殊用途寄存器,如:CS、DS、SS、ES、FS、GS、EIP和flag

每个设备控制器都有一个与之对应的应用程序。设备控制器通过应用程序接口通过中断与操作系统通信。设备控制器是硬件,设备驱动程序是软件。

I/O设备通常由机械部件和电子部件组成。电子元件被称为设备控制器或适配器。在个人电脑上,它通常采用主板上的芯片或印刷电路卡的形式,可以插入(PCIe)扩展插槽。

机械设备本身就是一个整体,其组成如下:

制卡机上通常有一个连接器。连接设备本身的电缆可以插入该连接器。许多控制器可以操作2台、4台和8台相同的设备。

控制器和设备之间的接口通常是低级接口。例如,一个磁盘可以格式化为2000000个扇区,每个磁道512字节。然而,驱动程序实际产生的是一个串行位流,先是前导码,然后是扇区中的4096位,最后是校验和或ECC(纠错码)。磁盘格式化时写入前导。它包括气缸数、扇区号、扇区大小和类似数据。此外,它还包含同步信息。

控制器的任务是将串行位流转换为字节块,并纠正必要的错误。字节块通常在控制器内部的缓冲区中按位组装,然后校验和被验证为无错误,然后复制到内存中。

内存映射I/O

每个控制器都有几个与CPU通信的寄存器。通过写入这些寄存器,操作系统可以命令设备发送数据、接收数据、打开或关闭设备等。通过读取这些寄存器中的信息,操作系统可以知道设备的状态、是否准备好接受新命令等。

为了控制寄存器,许多设备都有数据缓冲区供系统读写。例如,在屏幕上显示像素的传统方法是使用视频RAM,它基本上只是程序和操作系统写入数据的数据缓冲区。

所以问题是,CPU如何与设备寄存器和设备数据缓冲区通信?有两种选择。第一种方法是为每个控制寄存器分配一个I/O端口号,它是一个8位或16位整数。所有I/O端口的集合形成一个受保护的I/O端口空间,因此普通用户程序无法访问它(只有操作系统才能访问它)。使用特殊的I/O指令,如

在雷格港

CPU可以读取控制寄存器端口的内容,并将结果放入CPU寄存器reg。同样,使用

出港,雷格

CPU可以将Reg的内容写入控制寄存器。大多数早期计算机,包括几乎所有大型机,如IBM360它的所有后续模型都是这样工作的。

控制寄存器是改变或控制CPU或其他数字设备一般行为的处理器寄存器。控制寄存器执行的常见任务包括中断控制、切换寻址模式、分页控制和协处理器控制。

在这个方案中,内存地址空间和I/O地址空间是不同的,如下图所示:

说明书

在R0,4中

MOVR0,4

这个设计完全不同。前者读取I/O端口4的内容而不将其放入R0,而后者读取内存字4的内容并将其放入R0。其中四个示例表示不同且不相关的地址空间。

第二种方法由PDP-11介绍,

什么是PDP-11?


会的所有控制寄存器都映射到内存空间如下图所示:

内存映射I/O它是一种在CPU及其连接的外围设备之间交换数据和指令的方法。这样,处理器和IO设备共享相同的内存内存位置内存,即处理器和IO设备使用内存地址进行映射。

在大多数系统中,分配给控制寄存器的地址位于或接近地址的顶部。

以下是一种混合方法:

内存的I/O模式有单独的I/O端口。X86采用了这种体系结构。在IBMPC兼容的计算机中,除了0到64K-1的I/O端口外,640K到1m-1的内存地址保留给设备的数据缓冲区。

这些项目是如何运作的?当CPU想要从内存或I/O端口读取一个字时,它应该将所需的地址放在总线地址线上,然后调用总线控制线上的读取信号。还有第二条信号线,用于指示所需的I/O空间或内存空间。如果是内存空间,内存将响应请求。如果是I/O空间,I/O设备将响应请求。如果只有内存空间,每个内存模块和每个I/O设备都会将地址行与其服务的地址范围进行比较。如果地址在该范围内,它将响应请求。内存和I/O设备永远不会同时分配地址,因此不会出现歧义和冲突。

内存映射I/O的优缺点

这两种寻址控制器方案各有优缺点。让我们首先看看内存映射I/O的优点。

首先,如果您需要一些特殊的I/O指令来读取和写入设备控制寄存器,则需要使用汇编代码来访问这些寄存器,因为在C或C++中无法执行输入和输出指令。调用这样的过程会增加I/O开销。在内存映射中,控制寄存器只是内存中的一个变量,可以像C语言中的其他变量一样寻址。

其次,对于内存映射的I/O,如果没有特殊的保护机制,可以阻止用户进程执行I/O操作。操作系统需要确保禁止将控制寄存器的地址空间放在用户的虚拟地址中。

第三,对于内存映射I/O,可以参考内存或控制寄存器中的每条指令,以便于参考。

在计算机设计中,几乎所有的东西都需要称重。内存映射I/O也是如此,它也有自己的缺点。首先,大多数计算机现在都有一些用于存储单词的缓存。缓存设备控制寄存器非常昂贵。为了避免内存映射I/O的许多情况,硬件必须有选择地禁用缓存。例如,禁用每个页面上的缓存。此功能增加了硬件和操作系统的复杂性,因此必须有选择性地对其进行管理。

启动项 命令

其次,如果只有一个地址空间,所有内存模块和所有I/O设备必须检查所有内存引用,以推断谁将响应。

什么是内存模块?在计算中,存储器模块是一块印刷电路板,其上安装有存储器集成电路。

如果计算机是单线架构,如下图所示:

很容易让每个内存模块和I/O设备查看每个地址。

然而,现代个人电脑的趋势是专用高速内存总线,如下图所示:


该总线用于优化内存访问速度。X86系统还可以有多种总线(内存、PCIe、SCSI和USB)。如下图所示:

在内存映射机器上使用单独的内存总线的问题在于,I/O设备无法通过内存总线查看内存地址,因此它们无法响应。此外,必须采取特殊措施,使内存映射I/O在具有多条线路的系统上工作。一种可能的方法是首先将所有内存引用发送到内存。如果内存响应失败,CPU将尝试另一条总线。

第二种设计是将探测设备放在内存总线上,释放所有指向感兴趣的I/O设备的潜在地址。这里的问题是,I/O设备可能无法像内存那样快速处理请求。

第三种可能的设计是过滤内存控制器中的地址,它与上述设计相匹配。在这种情况下,内存控制器芯片包含引导时预加载的范围寄存器。这种设计的缺点是,您需要在引导时确定哪些内存地址不是真正的内存地址。因此,每一个设计都有支持和反对它的理由,所以权衡和取舍是不可避免的。

直接存储器存取

无论CPU是否具有内存映射I/O,它都需要寻址设备控制器以与它们交换数据。CPU一次可以从I/O控制器请求一个字节的数据,但这样做会浪费CPU时间,因此经常使用称为直接内存访问的方案。为简单起见,我们假设CPU通过一条连接CPU、内存和I/O设备的系统总线访问所有设备和内存,如下图所示

现代操作系统实际上更加复杂,但原理是一样的。如果硬件有NicholasTse控制器,则操作系统只能使用NicholasTse。有时,该控制器将集成到磁盘控制器和其他控制器中,但这种设计要求每个设备上有一个单独的NicholasTse控制器。单个NicholasTse控制器可用于向多个设备传输数据,这些数据通常同时执行。

无论NicholasTse控制器的物理地址在哪里,它都可以独立于CPU访问系统总线,如上图所示。它包含几个可由CPU读写的寄存器,包括内存地址寄存器、字节计数寄存器和一个或多个控制寄存器。控制寄存器指定要使用的I/O端口、传输方向(从I/O设备读取或写入)、传输单元(一次一个字节或字),以及突发传输中要传输的字节数。

为了解释DMA的工作原理,让我们先看看如何使用DMA以及如何读取磁盘。

首先,控制器从磁盘驱动器逐位串行读取一个块(一个或多个扇区),直到整个信息块被放入控制器的内部缓冲区。

读检查可以确保没有读错误发生。然后控制器将产生一个中断。当操作系统开始运行时,它将从控制器的缓冲区一次重复读取一个字节或一个字的块信息,并将其存储在内存中。

DMA的工作原理

当使用DMA时,这个过程会变得不同。首先,CPU通过设置NicholasTse控制器的寄存器对其进行编程,以便NicholasTse控制器知道要将哪些数据传输到哪里。NicholasTse控制器还向磁盘控制器发送命令,通知其将数据从磁盘读取到其内部缓冲区,并验证验证是否合格。当有效数据在磁盘控制器的缓冲区中时,NicholasTse可以启动。

NicholasTse控制器通过向总线上的磁盘控制器发送读取请求来启动NicholasTse传输。这是第二步。与其他读取请求一样,磁盘控制器不知道或不关心它是来自CPU还是NicholasTse控制器。通常,要写入的内存地址位于总线的地址线上,因此当磁盘控制器匹配下一个字时,它知道在哪里写入该字。写入内存是另一个总线循环。这是第三步。写入操作完成后,磁盘控制器通过总线向NicholasTse控制器发送响应信号。这是第四步。

然后,NicholasTse控制器将增加内存地址并减少字节数。如果字节数仍然大于0,将循环执行步骤2-4,直到字节计数变为0。此时,NicholasTse控制器将中断CPU,并告诉它传输已完成。当操作系统开始运行时,它不会将磁盘块复制到内存中,因为它已经在内存中。

不同的尼古拉斯·DMA控制器的复杂性差异很大。最简单的NicholasTse控制器一次处理一次传输,如上所述。更复杂的情况是,许多传输同时被处理。这种控制器有多组寄存器,每个通道一组寄存器。发送完每个单词后,尼古拉斯·DMA控制器决定下一次使用哪个设备。NicholasTse控制器可以设置为使用轮询算法,也可以具有优先级规划设计,以便一些设备比其他设备得到更多的照顾。如果有明确的方法来区分响应信号,则可以同时暂停对不同设备控制器的多个请求。

许多公交车可以在两种模式下运行:一次一个字模式和闭塞模式。一些NicholasTse控制器也可以通过这两种方式进行操作。在前一种模式中,NicholasTse控制器请求发送一个单词并获取该单词。如果CPU想要使用总线,它必须等待。该设备可能潜入并窃取CPU的一个总线周期,从而稍微延迟CPU。这种机制被称为周期窃取。

在块模式下,NicholasTse控制器告诉设备获取总线,然后执行一系列传输操作,然后释放总线。这种操作的形式称为突发模式。这种模式比周期性窃取更有效,因为获取总线需要时间,而一次获取总线的成本是可以同时传输多个字。缺点是,如果此时执行长时间突发传输,则CPU和其他设备可能被阻塞很长时间。

在我们讨论的模型中,它有时被称为飞行模式。NicholasTse控制器将告诉设备控制器将数据直接传输到内存。一些NicholasTse控制器使用的另一种模式是,让设备控制器将单词发送给NicholasTse控制器,然后NicholasTse控制器发送第二个总线请求,以便在任何可以写入单词的地方写入该单词。使用这种方案,每个传输的字都需要额外的总线周期,但它更灵活,因为它还可以执行设备到设备的复制,甚至是内存到内存的复制(通过提前读取内存,然后写入内存)。

大多数NicholasTse控制器使用物理地址进行传输。使用物理地址需要操作系统将目标内存缓冲区的虚拟地址转换为物理地址,并将物理地址写入NicholasTse控制器的地址寄存器。另一种方案是,一些NicholasTse控制器将虚拟地址写入NicholasTse控制器。然后,NicholasTse控制器必须使用MMU完成从虚拟到物理的转换。只有当MMU是内存的一部分而不是CPU的一部分时,才能将虚拟地址放在总线上。

倒带中断

在个人计算机体系结构中,中断结构如下

当I/O设备完成其工作时,它将生成一个中断(默认操作系统已打开该中断),该中断通过在总线上声明分配的信号来实现这一目的。主板上的中断控制器芯片将检测到该信号,然后执行中断操作。

如果在中断之前没有其他中断操作阻塞,中断控制器将立即处理中断。如果在中断之前执行了其他中断操作,或者如果其他设备发送更高级别的中断信号,则设备将暂时不处理。在这种情况下,设备将继续在总线上设置中断信号,直到CPU为其提供服务。

为了处理中断,中断控制器在地址线上放置一个数字,指定要关注的设备,并声明一个中断CPU的信号。CPU正在做其他事情的信号会导致CPU停止工作。地址行上将有一个指向中断向量表的索引,以获取下一个程序计数器。新获得的程序计数器指示程序即将启动,并将指向程序的开始。一般来说,从这个角度来看,陷阱和中断使用相同的机制,并且通常共享相同的中断向量。中断向量的位置可以硬连线到机器或位于内存中的任何位置,CPU寄存器指向其起点。

中断服务程序开始运行后,中断服务程序通过向中断控制器的I/O端口写入一个值来确认中断。告诉它,中断控制器可以自由发出另一个中断。当多个中断通过延迟CPU的响应同时到达CPU时,就会发生竞争。一些旧计算机没有集中的中断控制器,通常每个设备都请求自己的中断。

硬件通常在服务程序启动前保存当前信息。对于不同的CPU,需要保存哪些信息以及保存在哪里有很大差异。无论是否保存其他信息,都必须保存程序计数器,这对所有CPU都是一样的,以便恢复中断的进程。所有可见寄存器和大量内部寄存器也应保存。

如上所述,硬件应该保存当前信息,所以保存到哪里是一个问题。一种选择是将其放入内部寄存器,必要时操作系统可以读取这些寄存器。这种方法造成的问题是,在读取存储在所有内部寄存器中的信息之前,设备在一段时间内无法响应,从而防止第二个内部寄存器重写内部寄存器的状态。

第二种方法是将信息保存在堆栈中,这也是大多数CPU使用的方法。然而,这种方法也有问题,因为使用的堆栈是不确定的。如果使用当前堆栈,它很可能是用户进程的堆栈。堆栈指针甚至是非法的,因此当硬件试图在其引用的地址写入时,它将导致致命错误。如果使用内核堆栈,堆栈指针是合法的,并且指向一个固定页面,这可能更容易。但是,切换到内核模式需要切换MMU上下文,可能会使缓存或TLB无效。静态或动态地重新加载这些东西会增加中断处理的时间,并浪费CPU时间。

精确中断和不精确中断

另一个问题是,现代CPU是高度流水线的,有时是超标量(内部并行)。在一些旧系统中,在执行每条指令后,微程序或硬件将检查是否存在未完成的中断。如果是这样,程序计数器和PSW将被推入堆栈以启动中断序列。中断程序后,旧的PSW和程序计数器将从堆栈中弹出,并恢复上一个进程。

下面是一个管道模型

当管道已满时发生中断时会发生什么?许多指令处于不同的执行阶段。当中断发生时,程序计数器的值可能无法正确反映已执行和未执行指令的边界。事实上,许多指令可能部分执行,不同的指令或多或少都已完成。在这种情况下,a程序计数器更可能反映下一条要取出并压入管道的指令的地址,而不是执行单元刚刚处理的指令的地址。

在超标量设计中,情况可能更糟:

根据内部资源(如功能单元和寄存器)的可用性,每条指令可以分解为微操作,这些操作可能会无序执行。当中断发生时,一些很久以前启动的指令可能尚未开始执行,而最近执行的指令可能即将立即完成。当中断信号出现时,可能有许多指令处于不同的完成状态,这些指令与程序计数器几乎没有关系。

使机器保持良好状态的中断称为精确中断。这种中断有四个特性:

  • PC(程序计数器)存储在已知位置
  • PC指向的指令之前的所有指令都已完全执行
  • 在PC指向的指令之后,所有指令都不会执行
  • PC指向的指令的执行状态是已知的

不符合上述要求的中断称为不精确中断。不精确的中断令人头痛。上图描述了不精确中断的现象。指令的执行时间和完成情况是不确定的,恢复也非常麻烦。

您可以还会对下面的文章感兴趣

最新评论

  1. 逾期不侯
    逾期不侯
    发布于:2022-04-27 23:03:52 回复TA
    寄存器对其进行编程,以便NicholasTse控制器知道要将哪些数据传输到哪里。NicholasTse控制器还向磁盘控制器发送命令,通知其将数据从磁盘读取到其内部缓冲区,并验证验证是否合格。当有效数据在磁盘控制器的缓冲区中时,NicholasTse可以启动。Nich
  1. 少年强则国强
    少年强则国强
    发布于:2022-04-27 15:32:01 回复TA
    计的缺点是,您需要在引导时确定哪些内存地址不是真正的内存地址。因此,每一个设计都有支持和反对它的理由,所以权衡和取舍是不可避免的。直接存储器存取无论CPU是否具有内存映射I/O,它都需要寻址设备控制器以与它们交换数据。CPU一次可以从I/O控制器请求一个字节的数据,但这样做会浪费
  1. 偷支挑花送给你
    偷支挑花送给你
    发布于:2022-04-27 18:26:48 回复TA
    位整数。所有I/O端口的集合形成一个受保护的I/O端口空间,因此普通用户程序无法访问它(只有操作系统才能访问它)。使用特殊的I/O指令,如在雷格港CPU可以读取控制寄存器端口的内容,并将结
  1. 令狐珊以香
    令狐珊以香
    发布于:2022-04-27 13:04:27 回复TA
    写的真好

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

使用微信扫描二维码后

点击右上角发送给好友