什么叫操作系统?

什么叫操作系统?
操作系统
现代操作系统由⼀个或多个处理器、主存、打印机、键盘、⿏标、显⽰器、⽹络接⼝以及各种输⼊/输出设备构成。计算机操作系统是⼀个复杂的系统。
然⽽,程序员不会直接和这些硬件打交道,⽽且每位程序员不可能会掌握所有操作系统的细节,这样我们就不⽤再编写代码了,所以在硬件的基础之上,计算机安装了⼀层软件,这层软件能够通过响应⽤户输⼊的指令达到控制硬件的效果,从⽽满⾜⽤户需求,这种软件称之为操作系统,它的任务就是为⽤户程序提供⼀个更好、更简单、更清晰的计算机模型。
我们⼀般常见的操作系统主要有 Windows、Linux、FreeBSD 或 OS X ,这种带有图形界⾯的操作系统被称为图形⽤户界⾯(Graphical User Interface, GUI),⽽基于⽂本、命令⾏的通常称为Shell。下⾯是我们所要探讨的操作系统的部件
这是⼀个操作系统的简化图,最下⾯的是硬件,硬件包括芯⽚、电路板、磁盘、键盘、显⽰器等我们上⾯提到的设备,在硬件之上是软件。⼤部分计算机有两种运⾏模式:内核态和⽤户态,软件中最基础的部分是操作系统,它运⾏在内核态中,内核态也称为管态和核⼼态,它们都是操作系统的运⾏状态,只
不过是不同的叫法⽽已。操作系统具有硬件的访问权,可以执⾏机器能够运⾏的任何指令。软件的其余部分运⾏在⽤户态下。
⽤户接⼝程序(shell 或者 GUI)处于⽤户态中,并且它们位于⽤户态的最低层,允许⽤户运⾏其他程序,例如 Web 浏览器、电⼦邮件阅读器、⾳乐播放器等。⽽且,越靠近⽤户态的应⽤程序越容易编写,如果你不喜欢某个电⼦邮件阅读器你可以重新写⼀个或者换⼀个,但你不能⾃⾏写⼀个操作系统或者是中断处理程序。这个程序由硬件保护,防⽌外部对其进⾏修改。
计算机硬件简介
操作系统与运⾏操作系统的内核硬件关系密切。操作系统扩展了计算机指令集并管理计算机的资源。因此,操作系统因此必须⾜够了解硬件的运⾏,这⾥我们先简要介绍⼀下现代计算机中的计算机硬件。
从概念上来看,⼀台简单的个⼈电脑可以被抽象为上⾯这种相似的模型,CPU、内存、I/O 设备都和总线串联起来并通过总线与其他设备进⾏通信。现代操作系统有着更为复杂的结构,会设计很多条总线,我们稍后会看到。暂时来讲,这个模型能够满⾜我们的讨论。
CPU
CPU 是计算机的⼤脑,它主要和内存进⾏交互,从内存中提取指令并执⾏它。⼀个 CPU 的执⾏周期是从内存中提取第⼀条指令、解码并决定它的类型和操作数,执⾏,然后再提取、解码执⾏后续的指令。重复该循环直到程序运⾏完毕。
每个 CPU 都有⼀组可以执⾏的特定指令集。因此,x86 的 CPU 不能执⾏ ARM 的程序并且 ARM 的 CPU 也不能执⾏ x86 的程序。由于访问内存获取执⾏或数据要⽐执⾏指令花费的时间长,因此所有的 CPU 内部都会包含⼀些寄存器来保存关键变量和临时结果。因此,在指令集中通常会有⼀些指令⽤于把关键字从内存中加载到寄存器中,以及把关键字从寄存器存⼊到内存中。还有⼀些其他的指令会把来⾃寄存器和内存的操作数进⾏组合,例如 add 操作就会把两个操作数相加并把结果保存到内存中。
除了⽤于保存变量和临时结果的通⽤寄存器外,⼤多数计算机还具有⼏个特殊的寄存器,这些寄存器对于程序员是可见的。其中之⼀就是程序计数器(program counter),程序计数器会指⽰下⼀条需要从内存提取指令的地址。提取指令后,程序计数器将更新为下⼀条需要提取的地址。
另⼀个寄存器是堆栈指针(stack pointer),它指向内存中当前栈的顶端。堆栈指针会包含输⼊过程中的有关参数、局部变量以及没有保存在寄存器中的临时变量。
还有⼀个寄存器是PSW(Program Status Word)程序状态字寄存器,这个寄存器是由操作系统维护的8
个字节(64位) long 类型的数据集合。它会跟踪当前系统的状态。除⾮发⽣系统结束,否则我们可以忽略 PSW 。⽤户程序通常可以读取整个PSW,但通常只能写⼊其某些字段。PSW 在系统调⽤和 I / O 中起着重要作⽤。芬尼根的守灵夜
操作系统必须了解所有的寄存器。在时间多路复⽤(time multiplexing)的 CPU 中,操作系统往往停⽌运⾏⼀个程序转⽽运⾏另外⼀个。每次当操作系统停⽌运⾏⼀个程序时,操作系统会保存所有寄存器的值,以便于后续重新运⾏该程序。
为了提升性能, CPU 设计⼈员早就放弃了同时去读取、解码和执⾏⼀条简单的指令。许多现代的 CPU 都具有同时读取多条指令的机制。例如,⼀个 CPU 可能会有单独访问、解码和执⾏单元,所以,当 CPU 执⾏第 N 条指令时,还可以对 N + 1 条指令解码,还可以读取 N + 2条指令。像这样的组织形式被称为流⽔线(pipeline),
⽐流⽔线更先进的设计是超标量(superscalar)CPU,下⾯是超标量 CPU 的设计
在上⾯这个设计中,存在多个执⾏单元,例如,⼀个⽤来进⾏整数运算、⼀个⽤来浮点数运算、⼀个⽤来布尔运算。两个或者更多的指令被⼀次性取出、解码并放⼊缓冲区中,直⾄它们执⾏完毕。只要⼀个执⾏单元空闲,就会去检查缓冲区是否有可以执⾏的指令。如果有,就把指令从缓冲区中取出并执⾏。这种设计的含义是应⽤程序通常是乱序执⾏的。在⼤多数情况下,硬件负责保证这种运算的结
果与顺序执⾏指令时的结果相同。
除了⽤在嵌⼊式系统中⾮常简单的 CPU 之外,多数 CPU 都有两种模式,即前⾯已经提到的内核态和⽤户态。通常情况下,PSW 寄存器中的⼀
个⼆进制位会控制当前状态是内核态还是⽤户态。当运⾏在内核态时,CPU 能够执⾏任何指令集中的指令并且能够使⽤硬件的功能。在台式机和服务器上,操作系统通常以内核模式运⾏,从⽽可以访问完整的硬件。在⼤多数嵌⼊式系统中,⼀部分运⾏在内核态下,剩下的⼀部分运⾏在⽤户态下。
⽤户应⽤程序通常运⾏在⽤户态下,在⽤户态下,CPU 只能执⾏指令集中的⼀部分并且只能访问硬件的⼀部分功能。⼀般情况下,在⽤户态下,有关 I/O 和内存保护的所有指令是禁⽌执⾏的。当然,设置 PSW 模式的⼆进制位为内核态也是禁⽌的。
为了获取操作系统的服务,⽤户程序必须使⽤系统调⽤(system call),系统调⽤会转换为内核态并且调⽤操作系统。TRAP指令⽤于把⽤户态切换为内核态并启⽤操作系统。当有关⼯作完成之后,在系统调⽤后⾯的指令会把控制权交给⽤户程序。我们会在后⾯探讨操作系统的调⽤细节。
需要注意的是操作系统在进⾏系统调⽤时会存在陷阱。⼤部分的陷阱会导致硬件发出警告,⽐如说试图被零除或浮点下溢等你。在所有的情况下,操作系统都能得到控制权并决定如何处理异常情况。有时,由于出错的原因,程序不得不停⽌。
多线程和多核芯⽚
Intel Pentinum 4也就是奔腾处理器引⼊了被称为多线程(multithreading)或超线程(hyperthreading, Intel 公司的命名)的特性,x86 处理器和其他⼀些CPU 芯⽚就是这样做的。包括 SSPARC、Power5、Intel Xeon 和 Intel Core 系列。近似地说,多线程允许 CPU 保持两个不同的线程状态并且在纳秒级(nanosecond)的时间完成切换。线程是⼀种轻量级的进程,我们会在后⾯说到。例如,如果⼀个进程想要从内存中读取指令(这通常会经历⼏个时钟周期),多线程 CPU 则可以切换⾄另⼀个线程。多线程不会提供真正的并⾏处理。在⼀个时刻只有⼀个进程在运⾏。
对于操作系统来讲,多线程是有意义的,因为每个线程对操作系统来说都像是⼀个单个的 CPU。⽐如⼀个有两个 CPU 的操作系统,并且每个 CPU 运⾏两个线程,那么这对于操作系统来说就可能是 4 个 CPU。
除了多线程之外,现在许多 CPU 芯⽚上都具有四个、⼋个或更多完整的处理器或内核。多核芯⽚在其上有效地承载了四个微型芯⽚,每个微型芯⽚都有⾃⼰的独⽴CPU。
如果要说在绝对核⼼数量⽅⾯,没有什么能赢过现代GPU(Graphics Processing Unit),GPU 是指由成千上万个微核组成的处理器。它们擅长处理⼤量并⾏的简单计算。
内存
计算机中第⼆个主要的组件就是内存。理想情况下,内存应该⾮常快速(⽐执⾏⼀条指令要快,从⽽不会拖慢 CPU 执⾏效率),⽽且⾜够⼤且便宜,但是⽬前的技术⼿段⽆法满⾜三者的需求。于是采⽤了不同的处理⽅式,存储器系统采⽤⼀种分层次的结构
顶层的存储器速度最⾼,但是容量最⼩,成本⾮常⾼,层级结构越向下,其访问效率越慢,容量越⼤,但是造价也就越便宜。
寄存器
存储器的顶层是 CPU 中的寄存器,它们⽤和 CPU ⼀样的材料制成,所以和 CPU ⼀样快。程序必须在软件中⾃⾏管理这些寄存器(即决定如何使⽤它们)
⾼速缓存
位于寄存器下⾯的是⾼速缓存,它多数由硬件控制。主存被分割成⾼速缓存⾏(cache lines)为 64 字节,内存地址的 0 - 63 对应⾼速缓存⾏ 0 ,地址 64 - 127 对应⾼速缓存⾏的 1,等等。使⽤最频繁的⾼速缓存⾏保存在位于 CPU 内部或⾮常靠近 CPU 的⾼速缓存中。当应⽤程序需要从内存中读取关键词的时候,⾼速缓存的硬件会检查所需要的⾼速缓存⾏是否在⾼速缓存中。如果在的话,那么这就是⾼速缓存命中(cache hit)。⾼速缓存满⾜了该请求,并且没有通过总线将内存请求发送到主内存。⾼速缓存命中通常需要花费两个时钟周期。缓存未命中需要从内
存中提取,这会消耗⼤量的时间。⾼速缓存⾏会限制容量的⼤⼩因为它的造价⾮常昂贵。有⼀些机器会有两个或者三个⾼速缓存级别,每⼀级⾼速缓存⽐前⼀级慢且容量更⼤。
缓存在计算机很多领域都扮演了⾮常重要的⾓⾊,不仅仅是 RAM 缓存⾏。
随机存储器(RAM):内存中最重要的⼀种,表⽰既可以从中读取数据,也可以写⼊数据。当机器关闭时,内存中的信息会丢失。
⼤量的可⽤资源被划分为⼩的部分,这些可⽤资源的⼀部分会获得⽐其他资源更频繁的使⽤权,缓存经常⽤来提升性能。操作系统⽆时⽆刻的不在使⽤缓存。例如,⼤多数操作系统在主机内存中保留(部分)频繁使⽤的⽂件,以避免重复从磁盘重复获取。举个例⼦,类似于
/home/ast/projects/minix3/src/kernel/clock.c这样的场路径名转换成的⽂件所在磁盘地址的结果也可以保存缓存中,以避免重复寻址。另外,当⼀个 Web 页⾯(URL) 的地址转换为⽹络地址(IP地址)后,这个转换结果也可以缓存起来供将来使⽤。
在任何缓存系统中,都会有下⾯这⼏个噬需解决的问题
何时把新的内容放进缓存
把新的内容应该放在缓存的哪⼀⾏
在需要空闲空间时,应该把哪块内容从缓存中移除
应该把移除的内容放在某个较⼤存储器的何处
并不是每个问题都与每种缓存情况有关。对于 CPU 缓存中的主存缓存⾏,当有缓存未命中时,就会调⼊新的内容。通常通过所引⽤内存地址的⾼位计算应该使⽤的缓存⾏。
缓存是解决问题的⼀种好的⽅式,所以现代 CPU 设计了两种缓存。第⼀级缓存或者说是L1 cache总是位于 CPU 内部,⽤来将已解码的指令调⼊ CPU 的执⾏引擎。对于那些频繁使⽤的关键字,多数芯⽚有第⼆个 L1 cache 。典型的 L1 cache 的⼤⼩为 16 KB。另外,往往还设有⼆级缓存,也就是L2 cache,⽤来存放最近使⽤过的关键字,⼀般是兆字节为单位。L1 cache 和 L2 cache 最⼤的不同在于是否存在延迟。访问 L1 cache 没有任何的延迟,然⽽访问 L2 cache 会有 1 - 2 个时钟周期的延后。
什么是时钟周期?计算机处理器或 CPU 的速度由时钟周期来确定,该时钟周期是振荡器两个脉冲之间的时间量。⼀般⽽⾔,每秒脉冲数越⾼,计算机处理器处理信息的速度就越快。时钟速度以 Hz 为
天津水灾单位测量,通常为兆赫(MHz)或千兆赫(GHz)。例如,⼀个4 GHz处理器每秒执⾏4,000,000,000个时钟周期。
计算机处理器可以在每个时钟周期执⾏⼀条或多条指令,这具体取决于处理器的类型。早期的计算机处理器和较慢的 CPU 在每个时钟周期只能执⾏⼀条指令,⽽现代处理器在每个时钟周期可以执⾏多条指令。
主存
在上⾯的层次结构中再下⼀层是主存,这是内存系统的主⼒军,主存通常叫做RAM(Random Access Memory),由于 1950 年代和 1960 年代的计算机使⽤微⼩的可磁化铁氧体磁芯作为主存储器,因此旧时有时将其称为核⼼存储器。所有不能再⾼速缓存中得到满⾜的内存访问请求都会转往主存中。
除了主存之外,许多计算机还具有少量的⾮易失性随机存取存储器。它们与 RAM 不同,在电源断电后,⾮易失性随机访问存储器并不会丢失内容。ROM(Read Only Memory)中的内容⼀旦存储后就不会再被修改。它⾮常快⽽且便宜。(如果有⼈问你,有没有什么⼜快⼜便宜的内存设备,那就是 ROM 了)在计算机中,⽤于启动计算机的引导加载模块(也就是 bootstrap )就存放在 ROM 中。另外,⼀些 I/O 卡也采⽤ROM 处理底层设备控制。
肝脓疡
EEPROM(Electrically Erasable PROM,)和闪存(flash memory)也是⾮易失性的,但是与 ROM 相反,它们可以擦除和重写。不过重写它们需要⽐写⼊RAM 更多的时间,所以它们的使⽤⽅式与 ROM 相同,但是与 ROM 不同的是他们可以通过重写字段来纠正程序中出现的错误。
闪存也通常⽤来作为便携性的存储媒介。闪存是数码相机中的胶卷,是便携式⾳乐播放器的磁盘。闪存的速度介于 RAM 和磁盘之间。另外,与磁盘存储器不同的是,如果闪存擦除的次数太多,会出现磨损。
还有⼀类是 CMOS,它是易失性的。许多计算机都会使⽤ CMOS 存储器保持当前时间和⽇期。
磁盘
下⼀个层次是磁盘(硬盘),磁盘同 RAM 相⽐,每个⼆进制位的成本低了两个数量级,⽽且经常也有两个数量级⼤的容量。磁盘唯⼀的问题是随机访问数据时间⼤约慢了三个数量级。磁盘访问慢的原因是因为磁盘的构造不同
磁盘是⼀种机械装置,在⼀个磁盘中有⼀个或多个⾦属盘⽚,它们以 5400rpm、7200rpm、10800rpm 或更⾼的速度旋转。从边缘开始有⼀个机械臂悬横在盘⾯上,这类似于⽼式播放塑料唱⽚ 33 转唱机上的拾⾳臂。信息会写在磁盘⼀系列的同⼼圆上。在任意⼀个给定臂的位置,每个磁头可以
读取⼀段环形区域,称为磁道(track)。把⼀个给定臂的位置上的所有磁道合并起来,组成了⼀个柱⾯(cylinder)。
每个磁道划分若⼲扇区,扇区的值是 512 字节。在现代磁盘中,较外部的柱⾯⽐较内部的柱⾯有更多的扇区。机械臂从⼀个柱⾯移动到相邻的柱⾯⼤约需要 1ms。⽽随机移到⼀个柱⾯的典型时间为 5ms ⾄ 10ms,具体情况以驱动器为准。⼀旦磁臂到达正确的磁道上,驱动器必须等待所需的扇区旋转到磁头之下,就开始读写,低端硬盘的速率是50MB/s,⽽⾼速磁盘的速率是160MB/s。
p2p流媒体
需要注意,固态硬盘(Solid State Disk, SSD)不是磁盘,固态硬盘并没有可以移动的部分,外形也不像唱⽚,并且数据是存储在存储器(闪存)中,与磁盘唯⼀的相似之处就是它也存储了⼤量即使在电源关闭也不会丢失的数据。
许多计算机⽀持⼀种著名的虚拟内存机制,这种机制使得期望运⾏的存储空间⼤于实际的物理存储空间。其⽅法是将程序放在磁盘上,⽽将主存作为⼀部分缓存,⽤来保存最频繁使⽤的部分程序,这种机制需要快速映像内存地址,⽤来把程序⽣成的地址转换为有关字节在 RAM 中的物理地址。这种映像由 CPU 中的⼀个称为存储器管理单元(Memory Management Unit, MMU)的部件来完成。
缓存和 MMU 的出现是对系统的性能有很重要的影响,在多道程序系统中,从⼀个程序切换到另⼀个程序的机制称为上下⽂切换(context switch),对来⾃缓存中的资源进⾏修改并把其写回磁盘是很有必要的。
I/O 设备
CPU 和存储器不是操作系统需要管理的全部,I/O设备也与操作系统关系密切。可以参考上⾯这个图⽚,I/O 设备⼀般包括两个部分:设备
控制器和设备本⾝。控制器本⾝是⼀块芯⽚或者⼀组芯⽚,它能够控制物理设备。它能够接收操作系统的指令,例如,从设备中读取数据并完成数据的处理。
在许多情况下,实际控制设备的过程是⾮常复杂⽽且存在诸多细节。因此控制器的⼯作就是为操作系统提供⼀个更简单(但仍然⾮常复杂)的接⼝。也就是屏蔽物理细节。任何复杂的东西都可以加⼀层代理来解决,这是计算机或者⼈类社会很普世的⼀个解决⽅案
I/O 设备另⼀部分是设备本⾝,设备本⾝有⼀个相对简单的接⼝,这是因为接⼝既不能做很多⼯作,⽽且也已经被标准化了。例如,标准化后任何⼀个 SATA 磁盘控制器就可以适配任意⼀种 SATA 磁盘,所以标准化是必要的。ATA代表⾼级技术附件(AT Attachment),⽽ SATA 表
⽰串⾏⾼级技术附件(Serial ATA)。
AT 是啥?它是 IBM 公司的第⼆代个⼈计算机的⾼级技术成果,使⽤ 1984 年推出的 6MHz 80286 处理器,这个处理器是当时最强⼤的。
像是⾼级这种词汇应该慎⽤,否则 20 年后再回⾸很可能会被⽆情打脸。
现在 SATA 是很多计算机的标准硬盘接⼝。由于实际的设备接⼝隐藏在控制器中,所以操作系统看到的是对控制器的接⼝,这个接⼝和设备接⼝有很⼤区别。
每种类型的设备控制器都是不同的,所以需要不同的软件进⾏控制。专门与控制器进⾏信息交流,发出命令处理指令接收响应的软件,称为设备驱动程序(device driver)。每个控制器⼚家都应该针对不同的操作系统提供不同的设备驱动程序。
为了使设备驱动程序能够⼯作,必须把它安装在操作系统中,这样能够使它在内核态中运⾏。要将设备驱动程序装⼊操作系统,⼀般有三个途径
第⼀个途径是将内核与设备启动程序重新连接,然后重启系统。这是UNIX系统采⽤的⼯作⽅式海域划分
第⼆个途径是在⼀个操作系统⽂件中设置⼀个⼊⼝,通知该⽂件需要⼀个设备驱动程序,然后重新启动系统。在重新系统时,操作系统回寻有关的设备启动程序并把它装载,这是Windows采⽤的⼯作⽅式
第三个途径是操作系统能够在运⾏时接收新的设备驱动程序并⽴刻安装,⽆需重启操作系统,这种⽅式采⽤的少,但是正变得普及起来。热插拔设备,⽐如 USB 和 IEEE 1394 都需要动态可装载的设备驱动程序。
每个设备控制器都有少量⽤于通信的寄存器,例如,⼀个最⼩的磁盘控制器也会有⽤于指定磁盘地址、内存地址、扇区计数的寄存器。要激活控制器,设备驱动程序会从操作系统获取⼀条指令,然后翻译成对应的值,并写⼊设备寄存器中,所有设备寄存器的结合构成了I/O 端⼝空间。
在⼀些计算机中,设备寄存器会被映射到操作系统的可⽤地址空间,使他们能够向内存⼀样完成读写操作。在这种计算机中,不需要专门的I/O 指令,⽤户程序可以被硬件阻挡在外,防⽌其接触这些存储器地址(例如,采⽤基址寄存器和变址寄存器)。在另⼀些计算机中,设备寄存器被放⼊⼀个专门的 I/O 端⼝空间,每个寄存器都有⼀个端⼝地址。在这些计算机中,特殊的IN和OUT指令会在内核态下启⽤,它能够允许设备驱动程序和寄存器进⾏读写。前⾯第⼀种⽅式会限制特殊的 I/O 指令但是允许⼀些地址空间;后者不需要地址空间但是需要特殊的指令,这两种应⽤都很⼴泛。
实现输⼊和输出的⽅式有三种。
在最简单的⽅式中,⽤户程序会发起系统调⽤,内核会将其转换为相应驱动程序的程序调⽤,然后设备驱动程序启动 I/O 并循环检查该设备,看该设备是否完成了⼯作(⼀般会有⼀些⼆进制位⽤来指⽰设备仍在忙碌中)。当 I/O 调⽤完成后,设备驱动程序把数据送到指定的地⽅并返回。然后操作系统会将控制权交给调⽤者。这种⽅式称为忙等待(busy waiting),这种⽅式的缺点是要⼀直占据 CPU,CPU 会⼀直轮询 I/O 设备直到 I/O 操作完成。
第⼆种⽅式是设备驱动程序启动设备并且让该设备在操作完成时发⽣中断。设备驱动程序在这个时刻返回。操作系统接着在需要时阻塞调⽤者并安排其他⼯作进⾏。当设备驱动程序检测到该设备操作完成时,它发出⼀个中断通知操作完成。
在操作系统中,中断是⾮常重要的,所以这需要更加细致的讨论⼀下。
白山羊养殖技术如上图所⽰,这是⼀个三步的 I/O 过程,第⼀步,设备驱动程序会通过写⼊设备寄存器告诉控制器应该做什么。然后,控制器启动设备。当控制器完成读取或写⼊被告知需要传输的字节后,它会在步骤 2 中使⽤某些总线向中断控制器发送信号。如果中断控制器准备好了接收中断信号(如果正忙于⼀个优先级较⾼的中断,则可能不会接收),那么它就会在 CPU 的⼀个引脚上⾯声明。这就是步骤3
在第四步中,中断控制器把该设备的编号放在总线上,这样 CPU 可以读取总线,并且知道哪个设备完成了操作(可能同时有多个设备同时运⾏)。
⼀旦 CPU 决定去实施中断后,程序计数器和 PSW 就会被压⼊到当前堆栈中并且 CPU 会切换到内核态。设备编号可以作为内存的⼀个引⽤,⽤来寻该设备中断处理程序的地址。这部分内存称作中断向量(interrupt vector)。⼀旦中断处理程序(中断设备的设备驱动程序的⼀部分)开始后,它会移除栈中的程序计数器和 PSW 寄存器,并把它们进⾏保存,然后查询设备的状态。在中断处理程序全部完成后,它会返回到先前⽤户程序尚未执⾏的第⼀条指令,这个过程如下
实现 I/O 的第三种⽅式是使⽤特殊的硬件:直接存储器访问(Direct Memory Access, DMA)芯⽚。它可以控制内存和某些控制器之间的位流,⽽⽆需 CPU 的⼲预。CPU 会对 DMA 芯⽚进⾏设置,说明需要传送的字节数,有关的设备和内存地址以及操作⽅向。当 DMA 芯⽚完
成后,会造成中断,中断过程就像上⾯描述的那样。我们会在后⾯具体讨论中断过程
当另⼀个中断处理程序正在运⾏时,中断可能(并且经常)发⽣在不合宜的时间。因此,CPU 可以禁⽤中断,并且可以在之后重启中断。在 CPU 关闭中断后,任何已经发出中断的设备,可以继续保持其中断信号处理,但是 CPU 不会中断,直⾄中断再次启⽤为⽌。如果在关闭中断时,已经有多个设备发出了中断信号,中断控制器将决定优先处理哪个中断,通常这取决于事先赋予每个设备的优先级,
最⾼优先级的设备优先赢得中断权,其他设备则必须等待。
总线
上⾯的结构(简单个⼈计算机的组件图)在⼩型计算机已经使⽤了多年,并⽤在早期的 IBM PC 中。然⽽,随着处理器核内存变得越来越快,单个总线处理所有请求的能⼒也达到了上线,其中也包括 IBM PC 总线。必须放弃使⽤这种模式。其结果导致了其他总线的出现,它们处理 I/O 设备以及 CPU 到存储器的速度都更快。这种演变的结果导致了下⾯这种结构的出现。
上图中的 x86 系统包含很多总线,⾼速缓存、内存、PCIe、PCI、USB、SATA 和 DMI,每条总线都有不同的传输速率和功能。操作系统必须了解所有的总线配置和管理。其中最主要的总线是PCIe(Peripheral Component Interconnect Express)总线。
Intel 发明的 PCIe 总线也是作为之前古⽼的 PCI 总线的继承者,⽽古⽼的 PCI 总线也是为了取代古董级别的ISA(Industry Standard Architecture)总线⽽设⽴的。数⼗ Gb/s 的传输能⼒使得 PCIe ⽐它的前⾝快很多,⽽且它们本质上也⼗分不同。直到发明 PCIe 的 2004 年,⼤多数总线都是并⾏且共享的。共享总线架构(shared bus architeture)表⽰多个设备使⽤⼀些相同的电线传输数据。因此,当多个设备同时发送数据时,此时你需要⼀个决策者来决定谁能够使⽤总线。⽽ PCIe 则不⼀样,它使⽤专门的端到端链路。传统 PCI 中使⽤的并⾏总线架构(parallel bus architecture)表⽰通过多条电线发送
相同的数据字。例如,在传统的 PCI 总线上,⼀个 32 位数据通过 32 条并⾏的电线发送。⽽ PCIe 则不同,它选⽤了串⾏总线架构(serial bus architecture),并通过单个连接(称为通道)发送消息中的所有⽐特数据,就像⽹络数据包⼀样。这样做会
简化很多,因为不再确保所有 32 位数据在同⼀时刻准确到达相同的⽬的地。通过将多个数据通路并⾏起来,并⾏性仍可以有效利⽤。例如,可以使⽤ 32 条数据通道并⾏传输 32 条消息。
在上图结构中,CPU 通过 DDR3 总线与内存对话,通过 PCIe 总线与外围图形设备(GPU)对话,通过DMI(Direct Media Interface)总线经集成中⼼与所有其他设备对话。⽽集成控制中⼼通过串⾏总线与 USB 设备对话,通过 SATA 总线与硬盘和 DVD 驱动器对话,通过 PCIe 传输以太⽹络帧。
不仅如此,每⼀个核
USB(Univversal Serial Bus)是⽤来将所有慢速 I/O 设备(⽐如键盘和⿏标)与计算机相连的设备。USB 1.0 可以处理总计 12 Mb/s 的负载,⽽USB 2.0 将总线速度提⾼到 480Mb/s ,⽽ USB 3.0 能达到不⼩于 5Gb/s 的速率。所有的 USB 设备都可以直接连接到计算机并能够⽴刻开始⼯作,⽽不像之前那样要求重启计算机。
SCSI(Small Computer System Interface)总线是⼀种⾼速总线,⽤在⾼速硬盘,扫描仪和其他需要较⼤带宽的设备上。现在,它们主要⽤在服务器和⼯作站中,速度可以达到 640MB/s 。
计算机启动过程
那么有了上⾯⼀些硬件再加上操作系统的⽀持,我们的计算机就可以开始⼯作了,那么计算机的启动过程是怎样的呢?下⾯只是⼀个简要版的启动过程
在每台计算机上有⼀块双亲板,也就是母板,母板也就是主板,它是计算机最基本也就是最重要的部件之⼀。主板⼀般为矩形电路板,上⾯安装了组成计算机的主要电路系统,⼀般有 BIOS 芯⽚、I/O 控制芯⽚、键盘和⾯板控制开关接⼝、指⽰灯插接件、扩充插槽、主板及插卡的直流电源供电接插件等元件。
在母板上有⼀个称为基本输⼊输出系统(Basic Input Output System, BIOS)的程序。在 BIOS 内有底层 I/O 软件,包括读键盘、写屏幕、磁盘I/O 以及其他过程。如今,它被保存在闪存中,它是⾮易失性的,但是当BIOS 中发现错误时,可以由操作系统进⾏更新。
在计算机启动(booted)时,BIOS 开启,它会⾸先检查所安装的 RAM 的数量,键盘和其他基础设备是否已安装并且正常响应。接着,它开始扫描 PCIe 和 PCI 总线并出连在上⾯的所有设备。即插即⽤的设备也会被记录下来。如果现有的设备和系统上⼀次启动时的设备不同,则新的设备将被重新配置。
蓝后,BIOS 通过尝试存储在CMOS存储器中的设备清单尝试启动设备
CMOS是Complementary Metal Oxide Semiconductor(互补⾦属氧化物半导体)的缩写。它是指制造⼤规模集成电路芯⽚⽤的⼀种技术或⽤这种技术制造出来的芯⽚,是电脑主板上的⼀块可读写的 RAM 芯⽚。因为可读写的特性,所以在电脑主板上⽤来保存 BIOS 设置完电脑硬件参数后的数据,这个芯⽚仅仅是⽤来存放数据的。
⽽对 BIOS 中各项参数的设定要通过专门的程序。BIOS 设置程序⼀般都被⼚商整合在芯⽚中,在开机时通过特定的按键就可进⼊ BIOS 设置程序,⽅便地对系统进⾏设置。因此 BIOS 设置有时也被叫做 CMOS 设置。
⽤户可以在系统启动后进⼊⼀个 BIOS 配置程序,对设备清单进⾏修改。然后,判断是否能够从外部CD-ROM和 USB 驱动程序启动,如果启动失败的话(也就是没有),系统将从硬盘启动,boots 设备中的第⼀个扇区被读⼊内存并执⾏。该扇区包含⼀个程序,该程序通常在引导扇区末尾检查分区表以确定哪个分区处于活动状态。然后从该分区读⼊第⼆个启动加载程序,该加载器从活动分区中读取操作系统并启动它。
然后操作系统会询问 BIOS 获取配置信息。对于每个设备来说,会检查是否有设备驱动程序。如果没有,则会向⽤户询问是否需要插⼊CD-

本文发布于:2024-09-23 11:22:39,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/119987.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:设备   程序   计算机   内存   指令   缓存   需要   寄存器
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议