感谢支持
我们一直在努力

LPI 101 考试准备: 硬件和体系结构

BIOS 设置


   本节涵盖了针对初级管理员 101 考试(LPIC-1)的主题 1.101.1 的资料。此主题的权重为 1。


   首先大概了解现代的个人计算机,然后讨论建立系统的配置问题。我们将集中关注的是使用 x86 处理器(比如 Intel? Pentium? 或 AMD Athlon 处理器)并拥有一条 PCI 总线的系统,因为当前这些是最为常见的。


   这里所涉及的很多话题与针对具体外围设备的 LPI 目标有非常多重叠之处。本教程后面的章节将引用到本节的基本资料。


系统和 BIOS 概述


    现代的个人计算机(PC)系统都包括一个用于进行计算的中央处理单元(CPU)以及用来存储处理器所使用的数据的一些内存。为了使用此设备,我们需要连接外围设备,比如键盘、鼠标、显示器、硬盘、CD 或 DVD 驱动器、打印机、扫描仪和网卡,这就使我们能够输入、存储、打印、显示和传输数据。


    在刚刚描述的计算机中,处理器所使用的内存称为随机访问存储器(Random Access Memory,RAM)。在典型的 PC 中,此内存是 易失的(volatile),也就是说,它需要有电源才能保存数据。关闭 PC,内存就会被清空。从另一个角度来说,当我们关闭一台 PC 后,它就只是一堆硬件组件,什么也做不了,直到它被重构(reprogrammed)。当启动机器时会发生重构;这个过程称作 引导(bootstrapping 或 booting) 计算机。


引导过程和 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)、键盘、鼠标,以及可能的板载显示部件、声音部件和网络连接。用户可以启用或者禁用某些部件。例如,为了使用安装的声卡,板载的声音部件可能被禁用。用户还可以选择考虑使用哪些设备来引导系统,以及是否使用口令保护系统。

    要访问 BIOS 设置屏幕,通常需要有一个连接到系统的键盘。当系统加电启动时,会执行 Power On Self Test 或者 POST。在某些系统中,会简短地提示您按下一个特定的键来进入设置,否则就会进行正常引导。在其他系统上,需要知道在调用正常引导过程之前按哪个键,因为可能没有提示,或者在先前对设置选项的定制删除了提示。在某些系统中,除了进入 BIOS 设置以外,可能还会有其他选择,如图 1 所示。否则,应该会看到如图 2 所示的 BIOS 概要屏幕。

图 1. 访问 BIOS 设置

访问 BIOS 设置



图 2. BIOS 设置概要

BIOS 设置概要



    以上插图是可能会看到的内容示例,不过,各个 BIOS 设置屏幕差异很大,所以如果看到了不同的屏幕不要感到惊讶。


    图 2 告诉我们,闪存 EEPROM(或者系统 BIOS)版本号是 24KT52AUS,其日期标记是 2004 年 3 月 4 日,而系统的当前时间是 2005 年 6 月 9 日。查看制造商(IBM)的支持站点,会找到一些较新的可用 BIOS 版本,所以,升级这个系统的 BIOS 可能是个好主意。


     在图 2 中您会注意到其他一些菜单选项。在本教程后面的章节中我们将讨论这些选项。不过,在开始之前,让我们先再多研究一些 PC 的内部工作方式。


总线、端口、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 命令可以给出类似的信息。运行 cat /proc/pci 命令,可以看到类似于清单 1 的输出。



清单 1. /proc/pci




PCI devices found:
Bus 0, device 0, function 0:
Host bridge: Intel Corp. 82845G/GL [Brookdale-G] Chipset Host Bridge
(rev 1).
Prefetchable 32 bit memory at 0xd0000000 [0xdfffffff].
Bus 0, device 2, function 0:
VGA compatible controller: Intel Corp. 82845G/GL [Brookdale-G] Chipset
Integrated Graphics Device (rev 1).
IRQ 11.
Prefetchable 32 bit memory at 0x88000000 [0x8fffffff].
Non-prefetchable 32 bit memory at 0x80000000 [0x8007ffff].
Bus 0, device 29, function 0:
USB Controller: Intel Corp. 82801DB USB (Hub #1) (rev 1).
IRQ 11.
I/O at 0x1800 [0x181f].
Bus 0, device 29, function 1:
USB Controller: Intel Corp. 82801DB USB (Hub #2) (rev 1).
IRQ 10.
I/O at 0x1820 [0x183f].
Bus 0, device 29, function 2:
USB Controller: Intel Corp. 82801DB USB (Hub #3) (rev 1).
IRQ 5.
I/O at 0x1840 [0x185f].
Bus 0, device 29, function 7:
USB Controller: Intel Corp. 82801DB USB2 (rev 1).
IRQ 9.
Non-prefetchable 32 bit memory at 0xc0080000 [0xc00803ff].
Bus 0, device 30, function 0:
PCI bridge: Intel Corp. 82801BA/CA/DB/EB PCI Bridge (rev 129).
Master Capable. No bursts. Min Gnt=4.
Bus 0, device 31, function 0:
ISA bridge: Intel Corp. 82801DB LPC Interface Controller (rev 1).
Bus 0, device 31, function 1:
IDE interface: Intel Corp. 82801DB Ultra ATA Storage Controller
(rev 1).
IRQ 5.
I/O at 0x1860 [0x186f].
Non-prefetchable 32 bit memory at 0x60000000 [0x600003ff].
Bus 0, device 31, function 3:
SMBus: Intel Corp. 82801DB/DBM SMBus Controller (rev 1).
IRQ 9.
I/O at 0x1880 [0x189f].
Bus 0, device 31, function 5:
Multimedia audio controller: Intel Corp. 82801DB AC’97 Audio
Controller (rev 1).
IRQ 9.
I/O at 0x1c00 [0x1cff].
I/O at 0x18c0 [0x18ff].
Non-prefetchable 32 bit memory at 0xc0080c00 [0xc0080dff].
Non-prefetchable 32 bit memory at 0xc0080800 [0xc00808ff].
Bus 2, device 8, function 0:
Ethernet controller: Intel Corp. 82801BD PRO/100 VE (LOM) Ethernet
Controller (rev 129).
IRQ 9.
Master Capable. Latency=66. Min Gnt=8.Max Lat=56.
Non-prefetchable 32 bit memory at 0xc0100000 [0xc0100fff].
I/O at 0x2000 [0x203f].



    您可能希望对此输出与 lspci 命令的输出进行比较。后者通常在 root 用户的路径中,但 非-root 用户可能需要给出完全的路径 /sbin/lspci。在自己的系统去进行尝试。

IO 端口


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


    在 /proc 文件系统中,/proc/ioports 文件告诉我们关于系统中可用 IO 端口的信息。运行 cat /proc/ioports 命令可以看到类似清单 2 所示的输出。



清单 2. /proc/ioports




0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
0080-008f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : ide1
01f0-01f7 : ide0
02f8-02ff : serial(auto)
0376-0376 : ide1
0378-037a : parport0
03c0-03df : vga+
03f6-03f6 : ide0
03f8-03ff : serial(auto)
0cf8-0cff : PCI conf1
1800-181f : Intel Corp. 82801DB USB (Hub #1)
1800-181f : usb-uhci
1820-183f : Intel Corp. 82801DB USB (Hub #2)
1820-183f : usb-uhci
1840-185f : Intel Corp. 82801DB USB (Hub #3)
1840-185f : usb-uhci
1860-186f : Intel Corp. 82801DB Ultra ATA Storage Controller
1860-1867 : ide0
1868-186f : ide1
1880-189f : Intel Corp. 82801DB/DBM SMBus Controller
18c0-18ff : Intel Corp. 82801DB AC’97 Audio Controller
18c0-18ff : Intel ICH4
1c00-1cff : Intel Corp. 82801DB AC’97 Audio Controller
1c00-1cff : Intel ICH4
2000-203f : Intel Corp. 82801BD PRO/100 VE (LOM) Ethernet Controller
2000-203f : e100



    端口编号是十六进制的(基数为 16)。肯定会发现有一些看起来很熟悉,比如键盘、计时器、并行端口(打印机)、串行端口(调制解调器)和显示器(vga+)。将这些与清单 3 中给出了在 PC 中某些标准 IO 端口分配进行比较。例如,要注意的是,在 /proc/ioports 中为第一个并行端口(parport0)分配的地址范围是从 0378 到 037A,而标准中允许它(LPT!)使用的是从 378 到 37F。

清单 3. 标准 I/O 端口设置




1FO-1F8 – Hard Drive Controller, 16-bit ISA
200-20F – Game Control
210 – Game I/O
220 – Soundcard
278-27F – LPT2
2F8-2FF – COM2
320-32F – Hard Drive Controller, 8-bit ISA
378-37F – LPT1
3B0-3BF – Monochrome Graphics Adapter (MGA)
3D0-3DF – Colour Graphics Adapter (CGA)
3F0-3F7 – Floppy Controller
3F8-3FF – COM1

中断


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


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


    根据上一节的经验,毫无疑问关于中断的信息也保存在 /proc 文件系统中,在 /proc/interrupts 中。运行 cat /proc/interrupts 命令,可以看到类似于清单 4 的输出。



清单 4. /proc/interrupts




CPU0
0: 226300426 XT-PIC timer
1: 92913 XT-PIC keyboard
2: 0 XT-PIC cascade
5: 0 XT-PIC usb-uhci
8: 1 XT-PIC rtc
9: 2641134 XT-PIC ehci-hcd, eth0, Intel ICH4
10: 0 XT-PIC usb-uhci
11: 213632 XT-PIC usb-uhci
14: 1944208 XT-PIC ide0
15: 3562845 XT-PIC ide1
NMI: 0
ERR: 0



    这一次,中断数字是从 0 到 15 的十进制数。同样,将这些中断与清单 5 所示的 PC 标准 IRQ 分配进行比较。



清单 5. 标准 IRQ 设置




IRQ 0 – System Timer
IRQ 1 – Keyboard
IRQ 2(9) – Video Card
IRQ 3 – COM2, COM4
IRQ 4 – COM1, COM3
IRQ 5 – Available (LPT2 or Sound Card)
IRQ 6 – Floppy Disk Controller
IRQ 7 – LPT1
IRQ 8 – Real-Time Clock
IRQ 9 – Redirected IRQ 2
IRQ 10 – Available
IRQ 11 – Available
IRQ 12 – PS/2 Mouse
IRQ 13 – Math Co-Processor
IRQ 14 – Hard Disk Controller
IRQ 15 – Available

    最初,每个设备都有自己的私有 IRQ。做为示例,注意,在清单 5 中,IRQ5 通常用于声卡 或者 第二个并行端口(打印机)。如果两个都要使用,那么不得不去寻找一个能够配置的卡(通常是通过硬件跳线设置)来使用另一个 IRQ,比如 IRQ15。


    目前的 PCI 设备是共享 IRQ 的,所以,当某个设备中断 CPU 时,会有一个中断处理程序检查它并判断那个中断是否为它所用的中断,如果不是,则将它传递给链中的下一个处理程序。清单 4 和 5 并没有向我们展示这种共享。在后面的教程中我们将会学习 grep 命令,不过,现在我们可以使用它来过滤 dmesg 命令的输出,来查看关于 IRQ 的引导消息,如清单 6 所示。在此突出显示了共享的中断。



清单 6. 引导过程中发现的中断




[ian@lyrebird ian]$ dmesg | grep -i irq
PCI: Discovered primary peer bus 01 [IRQ]
PCI: Using IRQ router PIIX [8086/24c0] at 00:1f.0
PCI: Found IRQ 5 for device 00:1f.1
PCI: Sharing IRQ 5 with 00:1d.2
Serial driver version 5.05c (2001-07-08) with MANY_PORTS MULTIPORT
SHARE_IRQ SERIAL_PCI ISAPNP enabled
ttyS0 at 0x03f8 (irq = 4) is a 16550A
ttyS1 at 0x02f8 (irq = 3) is a 16550A
PCI: Found IRQ 5 for device 00:1f.1
PCI: Sharing IRQ 5 with 00:1d.2
ICH4: not 100% native mode: will probe irqs later
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
ide1 at 0x170-0x177,0x376 on irq 15
PCI: Found IRQ 11 for device 00:1d.0
PCI: Sharing IRQ 11 with 00:02.0
usb-uhci.c: USB UHCI at I/O 0x1800, IRQ 11
PCI: Found IRQ 10 for device 00:1d.1
usb-uhci.c: USB UHCI at I/O 0x1820, IRQ 10
PCI: Found IRQ 5 for device 00:1d.2
PCI: Sharing IRQ 5 with 00:1f.1
usb-uhci.c: USB UHCI at I/O 0x1840, IRQ 5
PCI: Found IRQ 9 for device 00:1d.7
ehci-hcd 00:1d.7: irq 9, pci mem f885d000
parport0: irq 7 detected
PCI: Found IRQ 9 for device 02:08.0
PCI: Found IRQ 9 for device 02:08.0
parport0: irq 7 detected
PCI: Found IRQ 11 for device 00:02.0
PCI: Sharing IRQ 11 with 00:1d.0
PCI: Found IRQ 9 for device 00:1f.5
PCI: Sharing IRQ 9 with 00:1f.3
i810: Intel ICH4 found at IO 0x18c0 and 0x1c00, MEM 0xc0080c00 and
0xc0080800, IRQ 9

DMA


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


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



清单 7. /proc/dma




4: cascade



    那就足够了吗?重要的是要记住,当 IO 实际发生时,大部分设备只请求一个或者有限数目的 DMA 通道,所以,在我们的示例中 /proc/dma 经常看起来是几乎是空的。也可以像前面处理 IRQ 那样,扫描引导消息来查找具有 DMA 能力设备的证据。



清单 8. /proc/dma




[ian@lyrebird ian]$ dmesg | grep -i dma
ide0: BM-DMA at 0x1860-0x1867, BIOS settings: hda:DMA, hdb:pio
ide1: BM-DMA at 0x1868-0x186f, BIOS settings: hdc:DMA, hdd:DMA
hda: 312581808 sectors (160042 MB) w/8192KiB Cache,
CHS=19457/255/63, UDMA(100)
hdc: 398297088 sectors (203928 MB) w/7936KiB Cache,
CHS=24792/255/63, UDMA(33)
ehci-hcd 00:1d.7: enabled 64bit PCI DMA

即插即用(Plug and play)


    早期的 PC 为特定设备分配固定的端口号和 IRQ,比如键盘或者并行打印端口。这导致难以添加新设备或者使用两个相同类型的设备,比如两个调制解调器或者两个打印机。第一个串行端口通常称为 COM1,第二个称为 COM2。Linux 系统通常将它们称为 ttyS0ttyS1。例如,某些可配置的卡通常具有硬件跳线,允许一个调制解调器既可以在 COM1 上使用也可以在 COM2 上使用。随着设备越来越多,原来分配的 IO 端口地址空间和 IRQ 不再能满足要求,从而提出了 即插即用(Plug and Play,PnP)。其思想是,允许设备告诉系统它需要多少资源及所需资源的种类,然后由 BIOS 告诉设备它应该使用的具体资源。IBM PS/2 开始使用这种半自动的配置,它使用了一种称为 微通道(microchannel) 的总线体系结构。后来,那个思想以及即插即用这一名称得到了 ISA 卡的使用,尤其是调制解调器和声卡,当时它们是流行的附加设备卡。PCI 总线进一步发展了那个思想,所有 PCI 设备都本质上是即插即用的。


    如果使用的系统恰巧安装了 ISA PnP 设备,那么要意识到您必须避免设备间端口和 IRQ 的冲突。两个设备不能共享端口;每个设备 必须 拥有它自己的端口。这同样适用于 DMA 通道。除了一些例外情形,ISA 设备也不能共享 IRQ。如果有 非-PnP 设备,那么必须手工配置每个设备,以使得它不与其他设备相冲突。PnP 能够做的事情是自动执行配置。不过,如果有某些 ISA 设备不参与 PnP,那么这可能不会总是完全成功。为了让系统可用,可能能够使用 isapnptools(接下来会讨论)来解决冲突,或者可能不得不重新分配 非-PnP 设备上的某些端口和 IRQ。


    在 2.4 内核之前,有一个名为 isapnptools 的软件包可以支持用户配置 PnP 设备。 isapnp 命令会解释配置文件(通常是 /etc/isapnp.conf)来配置 PnP 设备。这通常是在 Linux 引导过程中完成的。pnpdump 命令会扫描 PnP 设备,并转储 PnP 卡所需要的或者将要使用的资源列表。其格式可以由 isapnp 命令使用,只需要去掉实际希望使用的命令的注释。必须确保避免资源冲突。请参考 isapnp 和 pnpdump 的手册页以获得关于使用这些命令的更多资料。


    从 2.4 内核起,Linux 内核就已经集成了 PnP 支持,isapnptools 软件包成为过时工具。例如,在 2002 年 5 月发布的 Red Hat 7.3 中已经将它删除了。这种支持类似于前面讨论的 PCI 支持。可以使用 lspnp 命令(kernel-pcmcia-cs 软件包的一部分)来显示关于 PnP 设备的信息。如果 BIOS 在初始化过程中找到了 PnP 设备,那么可以在 /proc 文件系统中找到其信息。文件 /proc/bus/pnp 将包含此信息。在只有 PCI 的系统中,这个文件不会出现。


IDE 硬盘驱动器


    在现代 PC 系统中,Integrated Drive ElectronicsIDE)硬盘驱动器最为常见。与最初的 IBM PC-AT 相一致,这些也称为 AT AttachmentATA)。另一类使用 Small Computer System InterfaceSCSI)接口的驱动器也很流行,尤其是在服务器机器上。IDE 驱动器的优势在于价格低廉,而 SCSI 接口支持连接大量驱动器,并且在同一总线上对不同驱动器进行重叠操作的能力更强,因此具有更高的潜在性能。


    一种名为 Serial ATASATA)的新类型驱动器最近进入了市场。SATA 规范试图突破 ATA 规范的某些限制,同时保持与 ATA 的有效兼容。

软盘端口


    如果系统有一个传统的软盘控制器,那么它将使用端口 3F0-3F7。如果在一个没有附带传统软盘驱动器的系统中安装了一个这种驱动器,那么可能不得不在 BIOS 中启用传统的选项。参考制造商的资料,以了解更多细节。


键盘和鼠标


    键盘/鼠标控制器为传统键盘和鼠标使用端口 0060 和 0064。也就是说,那些是通过圆形的 PS2 连接器连接的。如果没有连接键盘,很多系统将会报告 Power-On-Self-TestV(POST)错误。大部分设计用作服务器的机器,以及很多桌面机,现在都有 BIOS 选项来允许在没有键盘和鼠标的情况下进行干净的(clean)启动。


    系统安装后,运行时没有键盘(或鼠标)几乎不会是问题。服务器通常是这样运行的。管理工作可以通过网络来完成,或者使用 web 管理工具,或者使用命令行界面,比如 telnet 或(更应该使用)ssh。


    在没有键盘的系统上进行安装通常使用通过串行端口连接终端(或终端模拟器)来完成。通常,需要借助键盘和显示器来确保 BIOS 设置正确,启用了串行端口。可能还需要一张定制的引导磁盘或者 CD 来执行 Linux 系统安装。


    通过 LAN 模拟串行连接是 IBM JS20 刀片服务器等系统使用的另一种方法。

BIOS 和 IDE 驱动器大小


    IDE 驱动器格式化为 扇区(sectors),即 512 字节的数据单元。一个驱动器可能包括多个旋转的盘面,所以扇区被排列中同心圆中,每个圆称为一个 柱面(cylinder)。通过 磁头(head) 来读写特定盘面的数据。要找到特定扇区的数据,磁盘会移动分配给那个柱面的磁头,选择适当的磁头并等待正确的扇区移动到磁头下面。这就引出了 CHS(表示 Cylinder、Head 和 Sector)寻址的概念。您可能也听说这叫做 磁盘几何学(disk geometry)


    历史上很不幸,早期的 BIOS 对所允许的 C、H 和 S 值实行了限制,并且,PC 所用的流行操作系统 DOS 也实行了另外的限制。在九十年代,磁盘的迅速超出了 BIOS 和 DOS 所施加的人为的 CHS 限制。人们使用了一些中间策略来将实际的 CHS 值转化为满足那些约束的 “虚拟”值,那些约束是 BIOS 本身的约束,或者是 Ontrack 的 Disk Manager 软件等底层软件例程的约束。


    就算是没有 BIOS 或者 DOS 的人工限制,CHS 设计也最多只允许 65536 个柱面、16 个磁头,以及 255 扇区/磁轨。这就将容量限制为 267386880 个扇区,即大约 137 GB。注意,磁盘的容量以 10 的幂次来度量,所以 1GB=1,000,000,000 字节,不同于某些其他 PC 值。


    解决方案是让系统忽略几何结构,交由驱动器来完成。系统不需要去查询 CHS 值,而只需要查询 逻辑块地址(Logical Block Address,LBA),驱动器电子装置会找出要读或写的实际扇区。这一过程在 1996 年被标准化,并由 ATA-2 标准所采纳(ANSI 标准 X3.279-1996,AT Attachment Interface with Extensions)。


    如前所述,BIOS 需要引导系统,所以,要从硬盘驱动器引导,BIOS 对磁盘的布局所了解的程度必须足以定位并加载初始化程序,初始化程序接下来加载整个操作系统。不支持 LBA 磁盘的较老的 BIOS 可能被限制只能从磁盘的前 1024 个柱面进行引导,或者至少前 1024 个柱面,就像是 BIOS 知道磁盘的几何结构一样!现在这种 BIOS 可能已经相当少见了,不过,如果确实需要使用这样一个 BIOS,那么它可能有用于 LBA 支持的设置,而且您可能需要将 /boot 目录置于前 1024 柱面之内的分区中。就算是系统可以顺利地从非常大的硬盘的最末尾处引导,但很多 Linux 分区工具会警告您分区扩展超出了 1024 柱面限制。

    图 3 展示了在我的 Intel 母板 BIOS 中可以看到的信息,这是我的一个 Linux 系统中的 250GB IDE 磁盘。



图 3. 一个大的 LBA 磁盘的 BIOS 视图


一个大的 LBA 磁盘的 BIOS 视图




    清单 9 给出的是在 Linux 系统中(本例中是 Fedora Core 3)针对图 3 中所使用的同一磁盘运行 hdparm -I /dev/hda 命令的输出。注意,CHS 值限制寻址范围为 4,128,705 柱面, LBA 值设置为 268,435,455 柱面(或者说是 137GB)。这些值共同暗示 LBA48 值中才是实际的容量。这个值是 490,234,752 柱面(或者说是 251GB)。


清单 9. hdparm -I /dev/hda 的输出




/dev/hda:

ATA device, with non-removable media
Model Number: Maxtor 6Y250P0
Serial Number: Y638VBWE
Firmware Revision: YAR41BW0
Standards:
Supported: 7 6 5 4
Likely used: 7
Configuration:
Logical max current
cylinders 16383 65535
heads 16 1
sectors/track 63 63

CHS current addressable sectors: 4128705
LBA user addressable sectors: 268435455
LBA48 user addressable sectors: 490234752
device size with M = 1024*1024: 239372 MBytes
device size with M = 1000*1000: 251000 MBytes (251 GB)
Capabilities:
LBA, IORDY(can be disabled)
Queue depth: 1



    当我们讨论引导时,应该注意另一个问题。默认情况下,PC 将从系统中的第一块 IDE 硬盘引导。某些系统的 BIOS 设置允许覆盖这一设置,但大部分情况下将会这样引导。系统首先从 master boot record 加载一小段代码,这段代码会给出从哪个分区进行引导的信息。在稍后的教程中我们将深入讨论 Linux 的引导加载程序。


    如果希望了解关于大容量磁盘的更多历史,请参阅 参考资料,其中有指向 Linux Documentation Project 的 Large Disk HOWTO 的链接。

Linux 磁盘名称


    在系列后面的教程中我们将深入讨论 Linux 如何使用磁盘。不过,现在应该介绍另一个重要的 Linux 文件系统,即 /dev 文件系统。类似于 /proc ,这也是一个假的文件系统,它描述的是某个 Linux 系统拥有的或者可以拥有的设备。在 /dev 文件系统中,可以看到 /dev/hda、/dev/hda5、/dev/sda、/dev/sdb1 等条目。还可以发现很多对应于其他设备类型的条目,不过,现在让我们来研究以 /dev/hd/dev/sd 开头的那些。


    以 /dev/hd 开头的设备,比如 /dev/hda 或 /dev/hda5,指的是 IDE 驱动器。第一个 IDE 控制器上的第一个设备是 /dev/hda,第二个(如果存在)是 /dev/hdb。同理,在第二个 IDE 控制器上的第一个设备是 /dev/hdc,第二个是 /dev/hdd。在清单 10 中可以看到,在 /dev 中定义的比系统中可能存在的要多很多。



清单 10. /dev/hd? and /dev/sd? 条目




[ian@lyrebird ian]$ ls /dev/hd?
/dev/hda /dev/hdd /dev/hdg /dev/hdj /dev/hdm /dev/hdp /dev/hds
/dev/hdb /dev/hde /dev/hdh /dev/hdk /dev/hdn /dev/hdq /dev/hdt
/dev/hdc /dev/hdf /dev/hdi /dev/hdl /dev/hdo /dev/hdr
[ian@lyrebird ian]$ ls /dev/sd?
/dev/sda /dev/sde /dev/sdi /dev/sdm /dev/sdq /dev/sdu /dev/sdy
/dev/sdb /dev/sdf /dev/sdj /dev/sdn /dev/sdr /dev/sdv /dev/sdz
/dev/sdc /dev/sdg /dev/sdk /dev/sdo /dev/sds /dev/sdw
/dev/sdd /dev/sdh /dev/sdl /dev/sdp /dev/sdt /dev/sdx

    与先前对 IRQ 的处理相同,可以使用 dmesg 命令来查找在引导过程中发现了哪些磁盘设备,我的某个系统的输出如清单 11 所示。



清单 11. 引导过程中发现的硬盘驱动器




[ian@lyrebird ian]$ dmesg | grep “[hs]d[a-z]”
Kernel command line: ro root=LABEL=RHEL3 hdd=ide-scsi
ide_setup: hdd=ide-scsi
ide0: BM-DMA at 0x1860-0x1867, BIOS settings: hda:DMA, hdb:pio
ide1: BM-DMA at 0x1868-0x186f, BIOS settings: hdc:DMA, hdd:DMA
hda: WDC WD1600JB-00EVA0, ATA DISK drive
hdc: Maxtor 6Y200P0, ATA DISK drive
hdd: SONY DVD RW DRU-700A, ATAPI CD/DVD-ROM drive

hda: attached ide-disk driver.
hda: host protected area => 1
hda: 312581808 sectors (160042 MB) w/8192KiB Cache,
CHS=19457/255/63, UDMA(100)
hdc: attached ide-disk driver.
hdc: host protected area => 1
hdc: 398297088 sectors (203928 MB) w/7936KiB Cache,
CHS=24792/255/63, UDMA(33)
hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 hda8 hda9 hda10 hda11 >
hdc: hdc1 < hdc5 hdc6 hdc7 hdc8 >
hdd: attached ide-scsi driver.



    通过清单 11 中突出显示的那些行,可以得知系统有两个 IDE 驱动器(hda 和 hdc)和一个 DVD-RW 驱动器(hdd)。注意,没有 hdb,表明系统中第一个 IDE 控制器上没有第二个驱动器。一个 IDE 驱动器可以拥有最多四个 主(primary)分区和不限数目的 逻辑(logical)分区。考虑清单 11 中的驱动器 hdc,可以发现它有一个主分区(hdc1)和四个逻辑分区(hdc5、hdc6、hdc7 和 hdc8)。在本系列后面的教程主题 104 中我们将会知道, hdc1 实际上是逻辑分区的一个容器(或 扩展(extended) 分区)。


     历史上,sda 和 sdb 等设备是 SCSI 磁盘,在学习如何 设置 SCSI 设备 时会对此进行深入讨论。发展到 2.4 内核时,通常使用 SCSI 模拟技术来处理 IDE CD 和 DVD 设备。这种设备在 /dev 中通常是以 /dev/cdrom 等形式出现,这是一个指向 SCSI 模拟设备的符号链接。对于前面所用的系统,清单 12 证明了 /dev/cdrom 是指向 /dev/scd0 的链接,而不是像可能预期的那样指向 /dev/hdd。注意,清单 11 中的 hdd=ide-scsi 内核参数也指出了 hdd 联接的是 ide-scsi 驱动器。



清单 12. IDE SCSI 模拟




[ian@lyrebird ian]$ ls -l /dev/cdrom
lrwxrwxrwx 1 root root 9 Jan 11 17:15 /dev/cdrom -> /dev/scd0


    现在您会发现 USB 和 SATA 存储设备都表现为 sd 设备,而不是 hd 设备。

传统外围设备


     我们已经提到过通常会集成到母板中的串行或并行端口等外围设备,也已经接触了一些用于这些设备的标准 IO 端口和 IRQ 分配。具体地,串行端口曾用于连接多种设备,过去一直难以配置。随着 IEEE 1394(也称为 FirewireUniversal Serial BusUSB))设备的出现,设备的自动配置和热插拔已经在很大程度上取代了确保串行或并行端口正确配置的繁琐事务。的确,非传统(legacy-free) 的系统并不支持标准的串行或并行端口。它既不支持软盘驱动器也不支持 PS/2 连接的键盘或鼠标。


现在将讨论可能需要配置的一些常见 BIOS 设置。


串行端口(COMn)


    传统的串行端口是 COM1 到 COM4。如果系统只有一个串行端口连接器(原来是 25-pin DB25,但现在更常见的是 9-pin DB9 连接器),那么它可能使用 COM1 的默认基地址和 IRQ,即 IO 端口 3F8 和 IRQ 4。表 1 中是串行端口的标准 IO 端口地址和 IRQ。



表 1. 串行端口分配






















名称 地址 IRQ
COM1 3F8-3FF 4
COM2 2F8-2FF 3
COM3 3E8-3EF 4
COM4 2E8-2EF 3


    可以注意到,COM1 和 COM3 共享 IRQ 4,同样,COM2 和 COM4 共享 IRQ 3。除非驱动程序和设备可以真正共享那个中断,或者某个设备不使用中断,否则这表示大部分真正的系统只会使用 COM1 和 COM2。


    有时,可能需要禁用板载的串行端口,或者配置它去使用另外的地址和 IRQ。这样做最可能的原因是与某个 ISA 插槽中的 PnP 调制解调器冲突,或者想要将 PnP 调制解调器作为 COM1 来使用。建议您只有当 Linux 检测到系统有问题的时候再去修改这些。


并行端口(LPTn)


    传统并行端口是 LPT1 到 LPT4,尽管当前通常最多只用两个。如果系统只有一个并行端口连接器,那么它可能使用 LPT1 的默认基地址和 IRQ,即 IO 端口 378 和 IRQ 7。表 2 中是并行端口的标准 IO 端口地址和 IRQ。



表 2. 并行端口分配


















名称 地址 IRQ
LPT1 378-37F 7
LPT2 278-27F 5
LPT* 3BC-3BE


    注意,IO 端口 3BC-3BE 原来是 Hercules 图形适配器所使用的,它也有一个并行端口。很多 BIOS 系统会把这个范围分配给 LPT1,然后将其他两个范围将分别成为 LPT2 和 LPT3,而不是 LPT1 和 LPT2。


    很多系统不为打印机使用中断,所以实际可能使用了 IRQ,也可能没有使用。为打印共享 IRQ,以及与声卡(Sound Blaster 兼容的)共享 IRQ 7,都并不罕见。


     并行端口先前用于向打印机打印数据流并保留一些行来报告状态。后来,并行端口被用来连接多种设备(包括早期的 CD-ROM 和磁带驱动器),所以只有输出的数据流改变成为双向数据流。


     当前适用于并行端口的标准是 IEEE Std. 1284-1994 Standard Signaling Method for a Bi-Directional Parallel Peripheral Interface for Personal Computers,它定义了五种信号模式。BIOS 可能会支持在设置中进行选择,比如 bi-directionalEPPECP 以及 EPP 和 ECP。ECP 表示 Enhanced Capabilities Port,是为使用打印机而设计的。EPP 表示 Enhanced Parallel Port,是为 CD-ROM 和磁带驱动器等设备设计的,它们在两个方向都要传输大量的数据。默认的 BIOS 选择应该是 ECP。和串行端口一样,只有当设备不正常工作时再去修改它。

赞(0) 打赏
转载请注明出处:服务器评测 » LPI 101 考试准备: 硬件和体系结构
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏