剖析虚幻渲染体系(18)- 操作系统(硬件概览)

18.2 计算机硬件概览

操作系统与运行它的计算机的硬件紧密相连,它扩展了计算机的指令集并管理其资源。一台简单的个人计算机可以抽象为类似于下图的模型,CPU、内存和I/O设备都通过系统总线连接,并通过它彼此通信。现代个人电脑的结构更复杂,涉及多条总线。

计算机硬件架构抽象图。

计算机硬件组成图。

Intel Core i7结构图。

18.2.1 CPU

计算机的“大脑”是CPU,它从内存中获取指令并执行它们。每个CPU的基本周期是从内存中获取第一条指令,对其进行解码以确定其类型和操作数,然后执行,然后获取、解码和执行后续指令。循环重复,直到程序结束。以这种方式执行程序。

每个CPU都有一组特定的指令可以执行。因此,x86处理器无法执行ARM程序,而ARM处理器无法执行x86程序。因为访问内存以获取指令或数据字比执行指令需要更长的时间,所以所有CPU都包含一些寄存器来保存关键变量和临时结果。因此,指令集通常包含将字从内存加载到寄存器,并将字从寄存器存储到内存的指令。其他指令将来自寄存器、内存或两者的两个操作数组合成一个结果,例如添加两个字并将结果存储在寄存器或内存中。

除了用于保存变量和临时结果的通用寄存器外,大多数计算机还具有程序员可见的几个专用寄存器。其中之一是程序计数器,它包含要提取的下一条指令的内存地址。获取该指令后,程序计数器将更新为指向其后续指令。另一个寄存器是堆栈指针,它指向内存中当前堆栈的顶部。堆栈包含每个已进入但尚未退出的过程的一个帧。过程的堆栈框架保存那些不保存在寄存器中的输入参数、局部变量和临时变量。另一个寄存器是PSW(程序状态字)。该寄存器包含由比较指令、CPU优先级、模式(用户或内核)和各种其他控制位设置的条件代码位。用户程序通常可以读取整个PSW,但通常只能写入其部分字段。PSW在系统调用和I/O中起着重要作用。

操作系统必须完全了解所有寄存器。当对CPU进行多路复用时,操作系统通常会停止正在运行的程序以(重新)启动另一个程序。每次停止运行的程序时,操作系统必须保存所有寄存器,以便在程序稍后运行时恢复。

为了提高性能,CPU设计者早已放弃了一次获取、解码和执行一条指令的简单模型。许多现代CPU都具有同时执行多条指令的功能。例如,CPU可能有单独的提取、解码和执行单元,因此在执行指令n时,它也可能是解码指令n+1和提取指令n+2。这种组织称为管道,如下图(a)所示,用于三级管道。较长的管道是常见的。在大多数管道设计中,一旦指令被提取到管道中,就必须执行它,即使前面的指令是执行的条件分支。管道给编译器编写者和操作系统编写者带来了极大的麻烦,因为它们向他们暴露了底层机器的复杂性,并且他们必须处理它们。

比管道设计更先进的是超标量(superscalar)CPU,如上图(b)所示。在这种设计中,有多个执行单元,例如一个用于整数运算,一个用于浮点运算,另一个用于布尔运算。两个或多个指令被同时获取、解码并转储到一个保持缓冲区,直到它们可以执行为止。一旦执行单元可用,它就会查看保持缓冲区中是否有它可以处理的指令,如果有,就从缓冲区中删除该指令并执行它。这种设计的一个含义是,程序指令经常乱序执行。在大多数情况下,要由硬件来确保产生的结果与顺序实现所产生的结果相同,但正如我们将看到的那样,操作系统上强加了令人讨厌的复杂性。

如前所述,除嵌入式系统中使用的非常简单的CPU外,大多数CPU都有两种模式,内核模式和用户模式。通常,PSW中的一个位控制模式。在内核模式下运行时,CPU可以执行其指令集中的每一条指令,并使用硬件的每一项功能。在台式机和服务器上,操作系统通常以内核模式运行,从而可以访问整个硬件。在大多数嵌入式系统上,一小部分以内核模式运行,其余操作系统以用户模式运行。

用户程序总是在用户模式下运行,该模式只允许执行指令的子集和访问功能的子集。通常,在用户模式下,所有涉及I/O和内存保护的指令都是不允许的。当然,也禁止将PSW模式位设置为进入内核模式。

要从操作系统获取服务,用户程序必须进行系统调用,该调用会进入内核并调用操作系统。TRAP指令从用户模式切换到内核模式,并启动操作系统。工作完成后,根据系统调用后的指令将控制权返回给用户程序。可以将其视为一种特殊的进程调用,它具有从用户模式切换到内核模式的附加属性。

值得注意的是,除了执行系统调用的指令之外,计算机还有陷阱(trap),大多数其它陷阱是由硬件警告异常情况(如试图除以0或浮点下溢)引起的。在所有情况下,操作系统都会得到控制,并且必须决定要做什么。有时程序必须因错误而终止,其他时候可以忽略错误(下溢数字可以设置为0)。最后,当程序事先宣布要处理某些类型的条件时,可以将控制权传递回程序,让它处理问题。

除了多线程之外,现在许多CPU芯片上都有四个、八个或更多完整的处理器或内核。下图中的多核芯片有效地携带了四个微型芯片,每个芯片都有自己的独立CPU,一些处理器(如Intel Xeon Phi和Tilera TilePro)已经在单个芯片上运行了60多核。使用这种多核芯片肯定需要多处理器操作系统。

顺便说一句,就绝对数量而言,没有什么能比得上现代GPU(图形处理单元),GPU是一个拥有数千个微内核的处理器,它们对于许多并行完成的小计算非常有用,比如在图形应用程序中渲染多边形。他们不太擅长连续任务,也很难编程。虽然GPU对操作系统很有用(例如,加密或处理网络流量),但操作系统本身不太可能在GPU上运行。

(a) 具有共享二级缓存的四核芯片。(b) 具有独立二级缓存的四核芯片。

18.2.2 内存

任何计算机的第二个主要部件是内存。理想情况下,内存应该非常快(比执行指令快,这样CPU就不会被内存占用),非常大且非常便宜。目前没有任何技术能够满足所有这些目标,因此采取了不同的方法。内存系统被构造为一个层次结构,如下图所示。与低层相比,顶层具有更高的速度、更小的容量和更高的每比特成本,通常是10亿或更多倍。

内存层级架构和速度示意图。

顶层由CPU内部的寄存器组成,它们由与CPU相同的材料制成,因此与CPU一样快,因此,访问它们没有任何延误。它们的可用存储容量通常是32位CPU上的32×32位,64位CPU上为64×64位,两种情况下都小于1 KB。程序必须在软件中自行管理寄存器(即决定在其中保存什么)。

高速缓存主要由硬件控制。主内存被划分为缓存行,通常为64字节,缓存线0中的地址为0到63,缓存线1中的地址是64到127,依此类推。最常用的缓存行保存在CPU内部或非常靠近CPU的高速缓存中,当程序需要读取内存字时,缓存硬件会检查所需的行是否在缓存中。如果是,称为缓存命中,则请求从缓存中得到满足,并且没有内存请求通过总线发送到主内存。缓存命中通常需要大约两个时钟周期,缓存未命中必须转移到内存中,会导致大量时间损失。由于高速缓存的成本较高,其大小受到限制,有些机器有两级甚至三级缓存,每级缓存都比前一级缓存更慢、更大。

缓存和内存结构。

缓存在计算机科学的许多领域都扮演着重要角色,不仅仅是缓存RAM行。每当一个资源可以划分为多个部分时,其中一些部分的使用量比其他部分大得多,缓存通常用于提高性能。操作系统一直在使用它。例如,大多数操作系统将频繁使用的文件(片段)保存在主内存中,以避免重复从磁盘获取它们。类似地,转换长路径名的结果如下:

/home/ast/projects/minix3/src/kernel/clock.c

可以缓存到文件所在的磁盘地址,以避免重复查找。最后,当网页(URL)的地址转换为网络地址(IP地址)时,可以缓存结果以供将来使用。还有许多其他用途。在任何缓存系统中,很快就会出现几个问题,包括:

1、何时将新项目放入缓存。

2、将新项目放入哪个缓存行。

3、需要插槽时要从缓存中删除的项。

4、将新收回的项目放在较大内存中的何处。

并非每个问题都与每个缓存情况相关。对于CPU缓存中的主内存缓存行,通常在每次缓存未命中时都会输入一个新项。要使用的缓存行通常是通过使用引用的内存地址的一些高位来计算的。例如,对于4096条64字节和32位地址的缓存行,可以使用位6到17来指定缓存行,其中位0到5是缓存行内的字节。在这种情况下,要删除的项与新数据进入的项相同,但在其他系统中可能不是。最后,当缓存行被重写到主内存时(如果缓存行在被缓存后已被修改),内存中要重写它的位置是由所讨论的地址唯一确定的。

缓存是一个好主意,现代CPU有两个缓存。第一级缓存或L1缓存始终位于CPU内部,通常将解码的指令送入CPU的执行引擎。大多数芯片都有第二个L1缓存,用于存储大量使用的数据字,一级缓存通常每个为16 KB。此外,通常还有一个称为L2缓存的第二个缓存,它保存了几兆字节的最近使用的内存字。一级缓存和二级缓存的区别在于定时,对一级缓存的访问不会有任何延迟,而对二级缓存的存取会延迟一个或两个时钟周期。

在多核芯片上,设计者必须决定缓存的位置。在下图(a),所有核心共享一个二级缓存。这种方法用于Intel多核芯片。相反,在下图(b)中,每个内核都有自己的二级缓存,AMD采用了这种方法。每种策略都有其优缺点,例如,Intel共享的二级缓存需要更复杂的缓存控制器,但AMD方法使保持二级缓存一致性更加困难。

在上上图的层次结构中,主内存紧随其后,是内存系统的主力,通常称为RAM(随机存取存储器),更早之前称之为磁芯存储器,因为20世纪50年代和60年代的计算机使用微小的可磁化铁氧体磁芯作为主存储器,所有无法从缓存中满足的CPU请求都会转到主内存。

除了主存储器之外,许多计算机还有少量非易失性随机存取存储器。与RAM不同,非易失性存储器在电源关闭时不会丢失其内容。ROM(只读存储器)是在工厂编程的,以后不能更改。它既快又便宜,在一些计算机上,用于启动计算机的引导加载程序包含在ROM中。此外,一些I/O卡附带ROM,用于处理低级设备控制。

EEPROM(电可擦除PROM)和闪存也是非易失性的,但与ROM相反,它们可以擦除和重写。然而,写它们比写RAM需要更多数量级的时间,因此它们的使用方式与ROM相同,只是有了一个额外的功能,即现在可以通过在现场重写它们来纠正程序中的错误。

闪存也常用作便携式电子设备的存储介质,在数码相机中用作胶片,在便携式音乐播放器中用作磁盘,仅举两个用途。闪存的速度介于RAM和磁盘之间。此外,与磁盘内存不同,如果擦除次数太多,它就会磨损。

另一种存储器是CMOS,它是易失性的。许多计算机使用CMOS存储器来保存当前时间和日期,CMOS存储器和增加时间的时钟电路由一个小电池供电,因此即使拔下电脑插头,时间也能正确更新。CMOS存储器还可以保存配置参数,例如从哪个磁盘启动。之所以使用CMOS,是因为它耗电很少,以至于原厂安装的电池通常可以使用几年。然而,当它开始出现故障时,计算机可能会出现阿尔茨海默病,忘记它多年来知道的事情,比如从哪个硬盘启动。

18.2.3 磁盘

磁盘存储每比特比RAM便宜两个数量级,通常也要大两个数量级别,唯一的问题是随机访问数据的时间慢了近三个数量级,原因是磁盘是一种机械装置,如下图所示。

磁盘由一个或多个旋转速度为5400、7200、10800 RPM或以上的金属盘组成。一个机械臂从角落绕着盘片旋转,类似于老式33-RPM留声机上播放乙烯基唱片的拾取臂,信息以一系列同心圆写入磁盘。在任何给定的手臂位置,每个头部都可以读取一个称为轨道的环形区域,给定手臂位置的所有轨道一起构成一个圆柱体。

每个磁道被划分为若干扇区,通常每个扇区512字节。在现代磁盘上,外圆柱体包含的扇区比内圆柱体多。将臂从一个圆柱体移动到另一个圆柱体大约需要1毫秒。根据驱动器的不同,将其移动到随机圆柱体通常需要5到10毫秒。一旦臂位于正确的轨道上,驱动器必须等待所需扇区在磁头下旋转,根据驱动器的RPM,额外延迟5毫秒到10毫秒。一旦扇区位于磁头之下,低端磁盘的读取或写入速度为50 MB/秒,而高速磁盘的读取和写入速度为160 MB/秒。

有时,我们会听到人们谈论实际上根本不是磁盘的磁盘,如SSD(固态磁盘)。SSD没有移动部件,不包含磁盘形状的盘片,并将数据存储在(闪存)内存中。它们与磁盘相似的唯一方式是,存储了大量数据,这些数据在断电时不会丢失。

许多计算机支持一种称为虚拟内存的方案,该方案通过将程序放在磁盘上并将主内存用作执行最频繁的部分的缓存,使运行大于物理内存的程序成为可能。此方案需要动态重新映射内存地址,以将程序生成的地址转换为字所在的RAM中的物理地址。此映射由CPU的一部分MMU(内存管理单元)完成。

缓存和MMU的存在会对性能产生重大影响。在多道程序设计系统中,当从一个程序切换到另一个程序(有时称为上下文切换)时,可能需要从缓存中清除所有修改过的块,并更改MMU中的映射寄存器。这两种操作昂贵很大,应该被开发者注意并规避。

18.2.4 I/O设备

IO存储设备根据速度和介质,有着以下的层级关系:

Linux中的网络分层如下:

CPU和内存不是操作系统必须管理的唯一资源,I/O设备还与操作系统进行大量交互,通常由两部分组成:控制器和设备本身。

控制器是物理控制设备的一个或一组芯片,接受来自操作系统的命令,例如从设备读取数据,并执行这些命令。在许多情况下,设备的实际控制是复杂和详细的,因此控制器的工作是为操作系统提供一个更简单(但仍然非常复杂)的接口。例如,磁盘控制器可能会接受从磁盘2读取扇区11206的命令。然后,控制器必须将此线性扇区编号转换为圆柱体、扇区和磁头。由于外部圆柱体的扇区比内部圆柱体的多,并且一些坏扇区已重新映射到其他扇区,因此这种转换可能会变得复杂。然后,控制器必须确定磁盘臂在哪个圆柱体上,并向其发出命令,以移入或移出所需数量的圆柱体。它必须等到正确的扇区在磁头下旋转,然后开始读取和存储从驱动器上下来的位,删除前导码并计算校验和。最后,它必须将输入的位组合成单词并存储在内存中。为了完成所有这些工作,控制器通常包含小型嵌入式计算机,这些计算机被编程来完成它们的工作。

另一部分是实际设备本身。设备有相当简单的接口,既是因为它们不能做很多事情,也是为了使它们成为标准。例如,需要后者,以便任何SATA磁盘控制器都可以处理任何SATA盘。SATA代表串行ATA,ATA代表AT附件,是围绕当时功能极为强大的6-MHz 80286处理器而构建的。SATA目前是许多计算机上的标准磁盘类型。由于实际的设备接口隐藏在控制器后面,操作系统看到的只是控制器的接口,可能与设备的接口有很大的不同。

因为每种类型的控制器都不同,所以需要不同的软件来控制每种控制器,与控制器对话、发出命令并接受响应的软件称为设备驱动程序,每个控制器制造商必须为其支持的每个操作系统提供一个驱动程序。例如扫描仪可能附带OS X、Windows 7、Windows 8和Linux的驱动程序。

要使用该驱动程序,必须将其放入操作系统中,以便它可以在内核模式下运行。驱动程序实际上可以在内核外运行,现在像Linux和Windows这样的操作系统确实提供了一些支持,绝大多数驱动程序仍在内核边界以下运行。目前只有极少数系统(如MINIX 3)在用户空间中运行所有驱动程序,必须允许用户空间中的驱动程序以受控方式访问设备,但并不简单。

有三种方法可以将驱动程序放入内核。第一种方法是用新的驱动程序重新链接内核,然后重新启动系统,例如许多较旧的UNIX系统。第二种方法是在操作系统文件中输入一个条目,告诉它需要驱动程序,然后重新启动系统。在引导时,操作系统会找到所需的驱动程序并加载它们,如Windows。第三种方法是让操作系统能够在运行时接受新的驱动程序,并动态安装它们,而无需重新启动。这种方式过去很少见,但现在越来越普遍了。热插拔设备,如USB和IEEE 1394设备,始终需要动态加载的驱动程序。

每个控制器都有少量用于与其通信的寄存器。例如,最小磁盘控制器可能具有指定磁盘地址、内存地址、扇区计数和方向(读或写)的寄存器。为了激活控制器,驱动程序从操作系统获取命令,然后将其转换为适当的值,写入设备寄存器。所有设备寄存器的集合构成I/O端口空间。

在某些计算机上,设备寄存器被映射到操作系统的地址空间(它可以使用的地址),因此它们可以像普通内存字一样读取和写入。在这类计算机上,不需要特殊的I/O指令,用户程序可以通过不将这些内存地址放在其可及范围内而远离硬件(例如,通过使用基址和限制寄存器)。在其他计算机上,设备寄存器放在一个特殊的I/O端口空间中,每个寄存器都有一个端口地址。在这些机器上,内核模式下有特殊的IN和OUT指令,允许驱动程序读取和写入寄存器。前一种方案不需要特殊的I/O指令,但会占用一些地址空间。后者不使用地址空间,但需要特殊说明。这两种系统都被广泛使用。

输入和输出可以用三种不同的方式完成。在最简单的方法中,用户程序发出一个系统调用,然后内核将其转换为对相应驱动程序的过程调用。然后,驱动程序启动I/O并在一个紧密的循环中持续轮询设备,以查看是否完成了操作(通常有一些位表示设备仍在忙)。当I/O完成时,驱动程序将数据(如果有)放在需要的位置并返回。然后,操作系统将控制权返回给调用者。这种方法称为繁忙等待,其缺点是占用CPU轮询设备直到完成。

第二种方法是驱动程序启动设备,并在完成时要求其中断。此时,驱动返回。然后,如果需要,操作系统会阻止调用者,并寻找其他工作。当控制器检测到传输结束时,它会生成一个中断以完成信号。

中断在操作系统中非常重要,所以让我们更仔细地研究一下这个想法。在下图(a)中,我们看到I/O的三步过程。在步骤1中,驱动程序通过写入其设备寄存器来告诉控制器要做什么。然后,控制器启动设备。当控制器完成读取或写入它被要求传输的字节数时,它在步骤2中使用某些总线向中断控制器芯片发送信号。如果中断控制器准备接受中断(如果它忙于处理更高优先级的中断,则可能不会接受),它在CPU芯片上断言一个管脚,在步骤3中告诉它。在步骤4中,中断控制器将设备的编号放在总线上,这样CPU就可以读取它,并知道哪个设备刚刚完成(许多设备可能同时运行)。

一旦CPU决定接受中断,程序计数器和PSW通常被推到当前堆栈上,CPU切换到内核模式。设备编号可用作内存部分的索引,以查找该设备的中断处理程序的地址。这部分内存称为中断向量。一旦中断处理程序(中断设备驱动程序的一部分)启动,它将删除堆叠程序计数器和PSW并保存它们,然后查询设备以了解其状态。当处理程序全部完成时,它返回到以前运行的用户程序,返回到尚未执行的第一条指令。这些步骤如下图(b)所示。

(a)启动I/O设备并获得中断的步骤。(b) 中断处理包括接受中断、运行中断处理程序和返回用户程序。

执行I/O的第三种方法使用特殊的硬件:DMA(直接内存访问)芯片,可以控制内存和某些控制器之间的比特流,而无需持续的CPU干预。CPU设置DMA芯片,告诉它要传输多少字节、涉及的设备和内存地址以及方向,然后让它执行。当DMA芯片完成时,它会触发中断,如上文所述进行处理。

例如,当另一个中断处理程序正在运行时,中断可能(而且经常)发生在非常不方便的时刻。因此,CPU有一种方法可以禁用中断,然后稍后重新启用它们。当中断被禁用时,任何完成的设备都会继续断言其中断信号,但CPU不会中断,直到再次启用中断。如果多个设备在中断被禁用时完成,中断控制器通常根据分配给每个设备的静态优先级决定首先让哪个设备通过。优先级最高的设备获胜并首先得到服务。其他必须等待。

18.2.5 总线

随着处理器和内存的速度越来越快,单个总线(当然还有IBM PC总线)处理所有流量的能力已经到了极限。为了更快的I/O设备和CPU到内存的通信量,添加了额外的总线。由于这一演变,一个大型x86系统目前看起来类似于下图。

大型x86系统的结构。

该系统有许多总线(例如,缓存、内存、PCIe、PCI、USB、SATA和DMI),每个总线具有不同的传输速率和功能。操作系统必须了解所有这些信息,以便进行配置和管理。

主总线是PCIe(外围组件互连高速)总线,PCIe总线是Intel作为旧PCI总线的继承者而发明的,而旧PCI总线又是原始ISA(行业标准体系结构)总线的替代品。PCIe能够每秒传输数十Gb的数据,比其前代产品快得多,它的性质也非常不同。直到2004年创建,大多数总线都是并行共享的,共享总线架构意味着多个设备使用相同的线路传输数据。因此,当多个设备有数据要发送时,需要一个仲裁器(arbiter)来确定谁可以使用总线。相反,PCIe使用专用的点到点连接,传统PCI中使用的并行总线架构意味着可以通过多条导线发送每个字的数据。例如,在常规PCI总线中,单个32位数字通过32条并行线发送。与此相反,PCIe使用串行总线体系结构,并通过单个连接(称为通道)发送消息中的所有位,就像网络数据包一样。这种方式简单得多,因为不必确保所有32位都在同一时间到达目的地。仍然使用平行性,因为可以有多条平行通道(lane),例如可以使用32条通道并行传输32条消息。随着网卡和图形适配器等外围设备速度的快速增长,PCIe标准每3-5年升级一次。例如,16通道PCIe 2.0提供每秒64 Gb的速率,升级到PCIe 3.0将使速度提高一倍,而PCIe 4.0将使速度再次提高一倍。

与此同时,仍有许多适用于旧PCI标准的传统设备,如上图所示,这些设备连接到单独的集线器处理器。未来,当我们认为PCI不再仅仅是老式的,而是老式的时,所有PCI设备都有可能连接到另一个集线器,而该集线器又将它们连接到主集线器上,从而形成总线树。

在此配置中,CPU通过快速DDR3总线与内存通信,通过PCIe与外部图形设备通信,并通过DMI(直接媒体接口)总线上的集线器与所有其他设备通信。集线器依次连接所有其他设备,使用通用串行总线与USB设备通信,使用SATA总线与硬盘和DVD驱动器交互,使用PCIe传输以太网帧。

此外,每个核心都有一个专用缓存和一个更大的缓存,在它们之间共享,每个缓存都引入另一条总线。

发明USB(通用串行总线)是为了将所有低速I/O设备(如键盘和鼠标)连接到计算机上。然而,对于以8-Mbps ISA作为第一台IBM PC的主总线而成长起来的一代人来说,将以5 Gbps“低速”运行的现代USB 3.0设备称为“低速”可能不是自然而然的。USB使用一个带有四到十一根线(取决于版本)的小连接器,其中一些线为USB设备供电或接地。USB是一种集中式总线,其中根设备每1毫秒轮询一次所有I/O设备,以查看它们是否有流量。USB 1.0可以处理12 Mbps的总负载,USB 2.0将速度提高到480 Mbps,USB 3.0最高不低于5 Gbps。任何USB设备都可以连接到计算机上,将立即运行,而无需重新启动计算机,这是USB设备之前所需的,让一代受挫的用户非常震惊。

SCSI(小型计算机系统接口)总线是一种高性能总线,用于快速磁盘、扫描仪和其他需要大量带宽的设备。如今,它们大多在服务器和工作站上,可以以高达640 MB/秒的速度运行。

要在上图所示的环境中工作,操作系统必须知道哪些外围设备连接到计算机并对其进行配置。这一要求促使英特尔和微软基于苹果Macintosh首次实现的类似概念,设计了一种称为即插即用的PC系统。在即插即用之前,每个I/O卡都有一个固定的中断请求级别和其I/O寄存器的固定地址。例如,键盘为中断1并使用I/O地址0x60至0x64,软盘控制器为中断6并使用I/O位置0x3F0至0x3F7,打印机为中断7并使用I/O位址0x378至0x37A,依此类推。

到目前为止,一切都很好。当用户购买了一张声卡和一张调制解调器卡,而这两张卡都碰巧使用了同一中断(如中断4)时,问题就出现了——会发生冲突,不能一起工作。解决方案是在每个I/O卡上包括DIP开关或跳线,并指示用户请将其设置为选择一个中断级别和I/O设备地址,该中断级别和输入/输出设备地址不会与用户系统中的任何其他地址冲突。不幸的是,极少人能做到,导致混乱。

即插即用所做的是让系统自动收集有关I/O设备的信息,集中分配中断级别和I/O地址,然后告诉每个卡的编号。这项工作与启动计算机密切相关,且不是简单的小事。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值