引导过程和 BIOS

引导的过程涉及到从外部存储设备(比如软盘、CD、DVD、硬盘或者存储钥匙(memory key))中加载操作系统。执行这一初始加载的程序固化存储在计算机中,称为 基本输入输出系统(Basic Input Output System,BIOS)。 BIOS 存储在非易失性的(non-volatile)存储器中,有时也称作 只读存储器(Read Only Memory,ROM)。在早期的 PC 中, ROM 芯片通常焊接或者套接在计算机的主板上(或者 母板)。更新 BIOS 意味着要更换 ROM 芯片。后来,使用了 Electrically Erasable Programmable Read Only Memories(EEPROMs)。 EEPROM 支持使用磁盘在运行中进行更新,而不需要专门的工具。现今您应该会更经常接触到的一种称为 闪存(Flash) 存储器的非易失性存储器,数码相机和存储钥匙也使用了它。闪存存储器也支持在运行时更新 BIOS。

除了控制 PC 的初始引导之外,现今的 BIOS 程序通常还允许用户设置或者检查系统中的一些配置选项。包括检查已经安装的部件,比如 RAM、硬盘驱动器、光驱(optical drive)、键盘、鼠标,以及可能的板载显示部件、声音部件和网络连接。用户可以启用或者禁用某些部件。例如,为了使用安装的声卡,板载的声音部件可能被禁用。用户还可以选择考虑使用哪些设备来引导系统,以及是否使用口令保护系统。

 

 

总线、端口、IRQ 和 DMA。

PCI 和 ISA 总线

外围设备(包括那些可能构建在系统板中的)通过 总线 与 CPU 通信。当前最常见的总线类型是 Peripheral Component InterconnectPCI)总线,它几乎已经完全取代了更早的 Industry Standard ArchitectureISA)总线。1984 年 IBM PC-AT 中首次使用它,之后 ISA 总线有时也称为 AT 总线。在从 ISA 到 PCI 总线的过渡过程中,很多系统同时包含了这两类总线的插槽,以使得 ISA 或 PCI 外围设备都能够使用。

ISA 总线支持 8-位 和 16-位 设备卡,而 PCI 总线支持 32-位 设备。

还有一些也应该了解的其他总线标准。很多系统中包括一个 Accelerated Graphics PortAGP)插槽,这是一个基于 PCI 2.1 总线规范的特殊插槽,但是为图形卡所需要的高带宽和快速响应进行了优化。它正在慢慢被更新的 PCI ExpressPCI-E)所取代,后者解决了先前 PCI 设计中的很多限制。

在本系列的最后一篇教程中将深入了解 Linux 文件系统,不过,在此先介绍 /proc 文件系统。这不是一个磁盘上的真实文件系统,而是一个“假的文件系统”,提供关于正在运行的系统的信息。在这个文件系统中,文件 /proc/pci 包含了系统 PCI 总线上设备的信息。曾经有一些关于废除这个特殊文件的讨论,因为 lspci 命令可以给出类似的信息。

 

IO 端口

当 CPU 需要与某个外围设备通信时,它要通过一个 IO 端口(有时只是简单的 端口)。当 CPU 需要向外围设备发送数据或者控制信息时,它向某个端口写入数据。当设备为 CPU 准备好了数据或者状态,CPU 从某个端口去读取数据或状态。大部分设备都拥有不止一个与之相关联的端口,通常是 2 的若干次幂(指数较小),比如 8、16 或者 32。数据传输通常是每次一个或两个字节。设备不能共享端口,所以,如果有 ISA 卡,那么必须确保每个设备都有其分配到了自己的端口。以前,这需要通过设备卡上的开关或者跳线来实现。一些晚期的 ISA 卡使用了一个名为 Plug and PlayPnP)的系统,本节稍后将讨论到。 PCI 卡全都有 PnP 配置。

 

中断

那么,CPU 如何知道最后一次输出何时完成?或者何时有数据在等待读取?通常,在一个状态寄存器中可以获得此信息,通过读取与某设备想关联的一个(或多个)IO 端口可以访问它。在这种情况下会出现两个问题。首先,CPU 不得不花费时间来检查状态。其次,如果设备持有来自某处的数据,比如连接的调制解调器,那些数据必须要及时被读取,否则就可能被下一个可用的数据字节所覆盖。

不浪费多余 CPU 周期,并确保数据能被及时读写,这两个问题是由 中断(interrupt) 的概念所解决的。中断也称为 中断请求(Interrupt Requests)IRQs。当设备中发生 CPU 需要知道的某事件时,设备就会发出一个中断,CPU 则临时停止正在做的其他工作,来处理那件事情。

 

 

DMA

先前提及的与外围设备通过 IO 端口进行的通信,每次传递一个或者两个字节。对于快速的设备,服务中断会用掉大量 CPU 处理能力。更快的方法是使用 直接内存访问(Direct Memory Access,DMA),使用很少 IO 指令告诉设备到 RAM 中哪个位置去读或写数据,然后 DMA 控制器提供 RAM 和外围设备之间数据实际传输的硬件管理。

谁可以猜出在哪里可以找到关于正在使用的 DMA 通道的信息,请举手。如果您说它是在 /proc/dma 中,那么就说对了。运行 cat /proc/dma 命令,可以看到如清单 7 所示的输出。