LinuxKernel核心中文手册(8)--设备驱动程序
来自:蓝森林自由软件
Chapter 8
Device Drivers (设备驱动程序)
操作系统其中一个目的就是向用户掩盖系统硬件设备的特殊性。例如,虚拟文件系
统呈现了安装的文件系统的一个统一的试图,而和底层的物理设备无关。本章描述 Lin
ux 核心是如何管理系统中的物理设备的。
CPU 不是系统中唯一的智能设备,每一个物理设备都由它自己的硬件控制器。键盘
、鼠标和串行口由 SuperIO 芯片控制, IDE 磁盘由 IDE 控制器控制, SCSI 磁盘由
SCSI 控制器控制,等等。每一个硬件控制器都由自己的控制和状态控制器( CSR ),
不同的设备之间是不同的。一个 Adaptec 2940 SCSI 控制器的 CSR 和 NCR 810 SCSI
控制器的完全不同。 CSR 用于启动和停止设备,初始化设备和诊断它的问题。管理这些
硬件控制器的代码不是放在每一个应用程序里边,而是放在 Linux 核心。这些处理或者
管理硬件控制器的软件脚做设备驱动程序。 Linux 核心的设备驱动程序本质上是特权的
、驻留内存的低级的硬件控制例程的共享库。是 Linux 的设备驱动程序在处理它们管理
发信人: sujm (小白蛇), 信区: KernelTech
标 题: Linux Kernel 核心中文手册(8)--设备驱动程序
发信站: BBS 水木清华站 (Fri Oct 5 16:32:14 2001)
太平洋软件咨询, 在这里你将找到你想要的东西。来看看吧,每天都有大量更新,不会
让朋友们失望的。
Linux Kernel核心中文手册
来自:蓝森林自由软件
Chapter 8
Device Drivers (设备驱动程序)
操作系统其中一个目的就是向用户掩盖系统硬件设备的特殊性。例如,虚拟文件系
统呈现了安装的文件系统的一个统一的试图,而和底层的物理设备无关。本章描述 Lin
ux 核心是如何管理系统中的物理设备的。
CPU 不是系统中唯一的智能设备,每一个物理设备都由它自己的硬件控制器。键盘
、鼠标和串行口由 SuperIO 芯片控制, IDE 磁盘由 IDE 控制器控制, SCSI 磁盘由
SCSI 控制器控制,等等。每一个硬件控制器都由自己的控制和状态控制器( CSR ),
不同的设备之间是不同的。一个 Adaptec 2940 SCSI 控制器的 CSR 和 NCR 810 SCSI
控制器的完全不同。 CSR 用于启动和停止设备,初始化设备和诊断它的问题。管理这些
硬件控制器的代码不是放在每一个应用程序里边,而是放在 Linux 核心。这些处理或者
管理硬件控制器的软件脚做设备驱动程序。 Linux 核心的设备驱动程序本质上是特权的
、驻留内存的低级的硬件控制例程的共享库。是 Linux 的设备驱动程序在处理它们管理
的设备的特质。
UNIX 的一个基本特点是它抽象了设备的处理。所有的硬件设备都象常规文件一样看
待:它们可以使用和操作文件相同的、标准的系统调用来进行打开、关闭和读写。系统
中的每一个设备都用一个设备特殊文件代表。例如系统中第一个 IDE 硬盘用 /dev/had
表示。对于块(磁盘)和字符设备,这些设备特殊文件用 mknod 命令创建,并使用主
( major )和次( minor )设备编号来描述设备。网络设备也用设备特殊文件表达,
但是它们由 Linux 在找到并初始化系统中的网络控制器的时候创建。同一个设备驱动程
序控制的所有设备都由一个共同的 major 设备编号。次设备编号用于在不同的设备和它
们的控制器之间进行区分。例如,主 IDE 磁盘的不同分区都由一个不同的次设备编号。
所以, /dev/hda2 ,主 IDE 磁盘的第 2 个分区的主设备号是 3 ,而次设备号是 2 。
Linux 使用主设备号表和一些系统表(例如字符设备表 chrdevs )把系统调用中传递
的设备特殊文件(比如在一个块设备上安装一个文件系统)映射到这个设备的设备驱动
程序中。
参见 fs/devices.c
Linux 支持三类的硬件设备:字符、块和网络。字符设备直接读写,没有缓冲区,
例如系统的串行端口 /dev/cua0 和 /dev/cua1 。块设备只能按照一个块(一般是 512
字节或者 1024 字节)的倍数进行读写。块设备通过 buffer cache 访问,可以随机存
取,就是说,任何块都可以读写而不必考虑它在设备的什么地方。块设备可以通过它们
的设备特殊文件访问,但是更常见的是通过文件系统进行访问。只有一个块设备可以支
持一个安装的文件系统。网络设备通过 BSD socket 接口访问,网络子系统在网络章(
第 10 章)描述。
Linux 有许多不同的设备驱动程序(这也是 Linux 的力量之一)但是它们都具有一些一
般的属性:
Kernel code 设备驱动程序和核心中的其他代码相似,是 kenel 的一部分,如果发
生错误,可能严重损害系统。一个写错的驱动程序甚至可能摧毁系统,可能破坏文件系
统,丢失数据。
Kenel interfaces 设备驱动程序必须向 Linux 核心或者它所在的子系统提供一个标准
的接口。例如,终端驱动程序向 Linux 核心提供了一个文件 I/O 接口,而 SCSI 设备
驱动程序向 SCSI 子系统提供了 SCSI 设备接口,接着,向核心提供了文件 I/O 和 bu
ffer cache 的接口。
Kernel mechanisms and services 设备驱动程序使用标准的核心服务例如内存分配、中
断转发和等待队列来完成工作
Loadable Linux 大多数的设备驱动程序可以在需要的时候作为核心模块加载,在不再需
要的时候卸载。这使得核心对于系统资源非常具有适应性和效率。
Configurable Linux 设备驱动程序可以建立在核心。哪些设备建立到核心在核心编译的
时候是可以配置的。
Dynamic 在系统启动,每一个设备启动程序初始化的时候它查找它管理的硬件设备。如
果一个设备驱动程序所控制的设备不存在并没有关系。这时这个设备驱动程序只是多余
的,占用很少的系统内存,而不会产生危害。
8.1 Poling and Interrupts (轮询和中断)
每一次给设备命令的时候,例如“把读磁头移到软盘的第 42 扇区“,设备驱动程
序可以选择它如何判断命令是否执行结束。设备驱动程序可以轮询设备或者使用中断。
轮询设备通常意味着不断读取它的状态寄存器,直到设备的状态改变指示它已经完
成了请求。因为设备驱动程序是核心的一部分,如果驱动程序一直在轮询,核心在设备
完成请求之前不能运行其他任何东西,会是损失惨重的。所以轮询的设备驱动程序使用
一个系统计时器,让系统在晚些时候调用设备驱动程序中的一个例程。这个定时器例程
会检查命令的状态, Linux 的软盘驱动程序就是这样工作的。使用计时器进行轮询是一
种最好的接近,而更加有效的方法是使用中断。
中断设备驱动程序在它控制的硬件设备需要服务的时候会发出一个硬件中断。例如:一
个以太网设备驱动程序会在设备在网络上接收到一个以太网报文的时候被中断。 Linux
核心需要有能力把中断从硬件设备转发到正确的设备驱动程序。这通过设备驱动程序向
核心登记它所使用的中断来实现。它登记中断处理程序例程的地址和它希望拥有的中断
编号。你通过 /proc/interrupts 可以看到设备驱动使用了哪些中断和每一类型的中断
使用了多少次:
0: 727432 timer
1: 20534 keyboard
2: 0 cascade
3: 79691 + serial
4: 28258 + serial
5: 1 sound blaster
11: 20868 + aic7xxx
13: 1 math error
14: 247 + ide0
15: 170 + ide1
对于中断资源的请求发生在驱动程序初始化的时间。系统中的一些中断是固定的,
这是 IBM PC 体系结构的遗留物。例如软驱磁盘控制器总是用中断 6 。其他中断,例如
PCI 设备的中断,在启动的时候动态分配。这时设备驱动程序必须首先找出它所控制的
设备的中断号,然后才能请求拥有这个中断(的处理权)。对于 PCI 中断, Linux 支
持标准的 PCI BIOS 回调( callback )来确定系统中设备的信息,包括它们的 IRQ 。
一个中断本身是如何转发到 CPU 依赖于体系结构。但是在大多数的体系上,中断都
用一种特殊的模式传递,而停止系统中发生其他中断。设备驱动程序在它的中断处理例
程中应该做尽可能少的工作,使得 Linux 核心可以结束中断并返回到它中断之前的地方
。收到中断后需要做大量工作的设备驱动程序可以使用核心的 bottom half handler 或
者任务队列把例程排在后面,以便在以后调用。
8.2 Direct Memory Access ( DMA )
当数据量比较少的时候用中断驱动的设备驱动程序向设备或者通过设备传输数据工
作地相当好。例如,一个 9600 波特率的 modem 每一毫秒( 1/1000 秒)大约可以传输
一个字符。如果中断延迟,就是从硬件设备发出中断到开始调用设备驱动程序中的中断
处理程序所花的时间比较少(比如 2 毫秒),那么数据传输对系统整体的映像就非常小
。 9600 波特率的 modem 数据传出只会占用 0.002% 的 CPU 处理时间。但是对于高速
的设备,比如硬盘控制器或者以太网设备,数据传输速率相当高。一个 SCSI 设备每秒
可以传输高达 40M 字节的信息。
直接内存存取,或者说 DMA ,就是发明来解决这个问题的。一个 DMA 控制器允许设备
不需要处理器的干预而和系统内存创树数据。 PC 的 ISA DMA 控制器由 8 个 DMA 通道
,其中 7 个可用于设备驱动程序。每一个 DMA 通道都关联一个 16 位的地址寄存器和
一个 16 位的计数寄存器( count register )。为了初始化一次数据传输,设备驱动
程序需要建立 DMA 通道的地址和计数寄存器,加上数据传输的方向,读或写。当传输结
束的时候,设备中断 PC 。这样,传输发生的时候, CPU 可以作其他事情。
使用 DMA 的时候设备驱动程序必须小心。首先,所有的 DMA 控制器都不了解虚拟
内存,它只能访问系统中的物理内存。因此,需要进行 DMA 传输的内存必须是物理内存
中连续的块。这意味着你不能对于一个进程的虚拟地址空间进行 DMA 访问。但是你可以
在执行 DMA 操作的时候把进程的物理也锁定到内存中。第二: DMA 控制器无法访问全
部的物理内存。 DMA 通道的地址寄存器表示 DMA 地址的首 16 位,跟着的 8 位来自于
页寄存器( page register )。这意味着 DMA 请求限制在底部的 16M 内存中。
DMA 通道是稀少的资源,只有 7 个,又不能在设备驱动程序之间共享。象中断一样
,设备驱动程序必须有能力发现它可以使用哪一个 DMA 通道。象中断一样,一些设备有
固定的 DMA 通道。比如软驱设备,总是用 DMA 通道 2 。有时,设备的 DMA 通道可以
用跳线设置:一些以太网设备用这种技术。一些更灵活的设备可以告诉它(通过它们的
CSR )使用哪一个 DMA 通道,这时,设备驱动程序可以简单地找出一个可用的 DMA 通
道。
Linux 使用 dma_chan 数据结构向量表(每一个 DMA 通道一个)跟踪 DMA 通道的
使用。 Dma_chan 数据结构只有两个玉:一个字符指针,描述这个 DMA 通道的属主,一
个标志显示这个 DMA 通道是否被分配。当你 cat /proc/dma 的时候显示的就是 dma_c
han 向量表。
8.3 Memory (内存)
设备驱动程序必须小心使用内存。因为它们是 Linux 核心的一部分,它们不能使用
虚拟内存。每一次设备驱动程序运行的时候,可能是接收到了中断或者调度了一个 but
tom half handler 或任务队列,当前的进程都可能改变。设备驱动程序不能依赖于一个
正在运行的特殊进程。象核心中其他部分一样,设备驱动程序使用数据结构跟踪它控制
的设备。这些数据结构可以在设备驱动程序的代码部分静态分配,但是这会让核心不必
要地增大而浪费。多数设备驱动程序分配核心的、不分页的内存存放它们的数据。
Linux 核心提供了核心的内存分配和释放例程,设备驱动程序正是使用了这些例程
。核心内存按照 2 的幂数的块进行分配。例如 128 或 512 字节,即使设备驱动程序请
求的数量没有这么多。设备驱动程序请求的字节数按照下一个块的大小取整。这使得核
心的内存回收更容易,因为较小的空闲块可以组合成更大的块。
请求核心内存的时候 Linux 还需要做更多的附加工作。如果空闲内存的总数太少,
物理页需要废弃或者写到交换设备。通常, Linux 会挂起请求者,把这个进程放到一个
等待队列,直到有了足够的物理内存。不是所有的设备驱动程序(或者实际是 Linux 的
核心代码)希望发生这样的事情,核心内存分配例程可以请求如果不能立刻分配内存就
失败。如果设备驱动程序希望为 DMA 访问分配内存,它也需要指出这块内存是可以进行
DMA 的。因为需要让 Linux 核心明白系统中哪些是连续的可以进行 DMA 的内存,而不
是让设备驱动程序决定。
8.4 Interfacing Device Drivers with the Kernel (设备驱动程序和核心接口)
Linux 核心必须能够用标准的方式和它们作用。每一类的设备驱动程序:字符、块
和网络,都提供了通用的接口供核心在需要请求它们的服务的时候使用。这些通用的接
口意味着核心可以完全相同地看待通常是非常不同的设备和它们的设备驱动程序。例如
, SCSI 和 IDE 磁盘的行为非常不同,但是 Linux 核心对它们使用相同的接口。
Linux 非常地动态,每一次 Linux 核心启动,它都可能遇到不同的物理设备从而需
要不同的设备驱动程序。 Linux 允许你在核心建立的时间通过配置脚本包含设备驱动程
序。当启动的时候这些设备驱动程序初始化,它们可能没发现它们可以控制的任何硬件
。其他驱动程序可以在需要的时候作为核心模块加载。为了处理设备驱动程序的这种动
态的特质,设备驱动程序在它们初始化的时候向核心登记。 Linux 维护已经登记的设备
驱动程序列表,作为和它们接口的一部分。这些列表包括了例程的指针和支持这一类设
备的接口的信息。
8.4.1 Character Devices (字符设备)
字符设备, Linux 最简单的设备,象文件一样访问。应用程序使用标准系统调用打
开、读取、写和关闭,完全好像这个设备是一个普通文件一样。甚至连接一个 Linux 系
统上网的 PPP 守护进程使用的 modem ,也是这样的。当字符设备初始化的时候,它的
设备驱动程序向 Linux 核心登记,在 chrdevs 向量表增加一个 device_struct 数据结
构条目。这个设备的主设备标识符(例如对于 tty 设备是 4 ),用作这个向量表的索
引。一个设备的主设备标识符是固定的。 Chrdevs 向量表中的每一个条目,一个 devi
ce_struct 数据结构,包括两个元素:一个登记的设备驱动程序的名称的指针和一个指
向一组文件操作的指针。这块文件操作本身位于这个设备的字符设备驱动程序中,每一
个都处理特定的文件操作比如打开、读、写和关闭。 /proc/devices 中字符设备的内容
来自 chrdevs 向量表
参见 include/linux/major.h
当代表一个字符设备(例如 /dev/cua0 )的字符特殊文件打开,核心必须做一些事
情,从而去掉用正确的字符设备驱动程序的文件操作例程。和普通文件或目录一样,每
一个设备特殊文件都用 VFS I 节点表达。这个字符特殊文件的 VFS inode (实际上所
有的设备特殊文件)都包括设备的 major 和 minor 标识符。这个 VFS I 节点由底层的
文件系统(例如 EXT2 ),在查找这个设备特殊文件的时候根据实际的文件系统创建。
参见 fs/ext2/inode.c ext2_read_inode()
每一个 VFS I 节点都联系着一组文件操作,依赖于 I 节点所代表的文件系统对象
不同而不同。不管代表一个字符特殊文件的 VFS I 节点什么时候创建,它的文件操作被
设置成字符设备的缺省操作。这只有一种文件操作: open 操作。当一个应用程序打开
这个字符特殊文件的时候,通用的 open 文件操作使用设备的主设备标识符作为 chrde
vs 向量表中的索引,取出这种特殊设备的文件操作块。它也建立描述这个字符特殊文件
的 file 数据结构,让它的文件操作指向设备驱动程序中的操作。然后应用程序所有的
文件系统操作都被映射到字符设备的文件操作。
参见 fs/devices.c chrdev_open() def_chr_fops
8.4.2 Block Devices (块设备)
块设备也支持象文件一样被访问。这种为打开的块特殊文件提供正确的文件操作组
的机制和字符设备的十分相似。 Linux 用 blkdevs 向量表维护已经登记的块设备文件
。它象 chrdevs 向量表一样,使用设备的主设备号作为索引。它的条目也是 device_s
truct 数据结构。和字符设备不同,块设备进行分类。 SCSI 是其中一类,而 IDE 是另
一类。类向 Linux 核心登记并向核心提供文件操作。一种块设备类的设备驱动程序向这
种类提供和类相关的接口。例如, SCSI 设备驱动程序必须向 SCSI 子系统提供接口,
让 SCSI 子系统用来对核心提供这种设备的文件操作
参见 fs/devices.c
每一个块设备驱动程序必须提供普通的文件操作接口和对于 buffer cache 的接口
。每一个块设备驱动程序填充 blk_dev 向量表中它的 blk_dev_struct 数据结构。这个
向量表的索引还是设备的主设备号。这个 blk_dev_struct 数据结构包括一个请求例程
的地址和一个指针,指向一个 request 数据结构的列表,每一个都表达 buffer cache
向设备读写一块数据的一个请求。
参见 drivers/block/ll_rw_blk.c include/linux/blkdev.h
每一次 buffer cache 希望读写一块数据到或从一个登记的设备的时候它就在它的
blk_dev_struc 中增加一个 request 数据结构。图 8.2 显示了每一个 request 都有
一个指针指向一个或多个 buffer_head 数据结构,每一个都是一个读写一块数据的请求
。这个 buffer_head 数据结构被锁定( buffer cache ),可能会有一个进程在等待这
个缓冲区的阻塞进程完成。每一个 request 结构都是从一个静态表, all_request 表
中分配的。如果这个 request 增加到一个空的 request 列表,就调用驱动程序的 req
uest 函数处理这个 request 队列。否则,驱动程序只是简单地处理 request 队列中的
每一个请求。
一旦设备驱动程序完成了一个请求,它必须把每一个 buffer_head 结构从 reques
t 结构中删除,标记它们为最新的,然后解锁。对于 buffer_head 的解锁会唤醒任何正
在等待这个阻塞操作完成的进程。这样的例子包括文件解析的时候:必须等待 EXT2 文
件系统从包括这个文件系统的块设备上读取包括下一个 EXT2 目录条目的数据块,这个
进程将会在将要包括目录条目的 buff_head 队列中睡眠,直到设备驱动程序唤醒它。这
个 request 数据结构会被标记为空闲,可以被另一个块请求使用。
8.5 Hard Disks (硬盘)
硬盘把数据存放在转动的磁碟上,提供了一个更永久存储数据的方式。为了写入数
据,微小的磁头把磁碟表面的一个微小的点磁化。通过磁头可以探测指定的微粒是否被
磁化,从而可以读出数据。
一个磁盘驱动器由一个或多个磁碟组成,每一个都用相当光滑的玻璃或者陶瓷制成
,并覆盖上一层精细的金属氧化物。磁碟放在一个中心轴上面,并按照稳定的速度转动
。转动速度根据型号不同从 3000 到 1000RPM (转 / 每分钟)。磁盘的读 / 写磁头负
责读写数据,每一个磁碟有一对,每一面一个。读 / 写磁头和磁碟表面并没有物理的接
触,而是在一个很薄的空气垫(十万分之一英寸)上面漂浮。读写磁头通过一个驱动器
在磁碟表面移动。所有的磁头都粘在一起,一起在磁碟表面移动。
每一个磁碟的表面都分成多个狭窄的同心环,叫做磁道( track )。磁道 0 是最
外面的磁道,最高编号的磁道是最接近中心轴的磁道。一个柱面( cylinder )是相同
编号磁道的组合。所以每一个磁碟的每一面的所有的第 5 磁道就是第 5 柱面。因为柱
面数和磁道数相同,所以磁盘的尺寸常用柱面来描述。每一个磁道分成扇区。一个扇区
是可以从硬盘读写的最小数据单元,也就是磁盘的块大小。通常扇区大小是 512 字节,
扇区大小通常是在制造磁盘的时候进行格式化的时候设定的。
磁盘通常用它的尺寸( geometry )描述:柱面数、磁头数和扇区数。例如,启动
的时候 Linux 这样描述我的 IDE 磁盘:
hdb: Conner Peripherals 540MB - CFS540A, 516MB w/64kB Cache, CHS=1050/16/63
这意味着它由 1050 柱面(磁道), 16 头( 8 个磁碟)和 63 个扇区 / 磁道。
对于 512 字节的扇区或块大小,磁盘的容量是 529200K 字节。这和磁盘声明的 516M
的存储能力不符合,因为一些扇区用作存储磁盘的分区信息。一些磁盘可以自动找出坏
的扇区,对其进行重新索引。
硬盘可以再分为分区。一个分区是分配用于特定目的的一大组扇区。对磁盘分区允
许磁盘用于几个操作系统或多个目的。大多数单个磁盘的 Linux 系统都由 3 个分区:
一个包含 DOS 文件系统,另一个是 EXT2 文件系统,第三个是交换分区。硬盘的分区用
分区表描述,每一个条目用磁头、扇区和柱面号描述分区的起止位置。对于用 fdisk 格
式化的 DOS 磁盘,可以有 4 个主磁盘分区。不是分区表所有的 4 个条目都必须用到。
Fdisk 支持三种类型的分区:主分区、扩展分区和逻辑分区。扩展分区不是真正的分区
,它可以包括任意数目的逻辑分区。发明扩展分区和逻辑分区是为了突破 4 个主分区的
限制。下面是一个包括 2 个主分区的磁盘的 fdisk 的输出:
Disk /dev/sda: 64 heads, 32 sectors, 510 cylinders
Units = cylinders of 2048 * 512 bytes
Device Boot Begin Start End Blocks Id System
/dev/sda1 1 1 478 489456 83 Linux native
/dev/sda2 479 479 510 32768 82 Linux swap
Expert command (m for help): p
Disk /dev/sda: 64 heads, 32 sectors, 510 cylinders
Nr AF Hd Sec Cyl Hd Sec Cyl Start Size ID
1 00 1 1 0 63 32 477 32 978912 83
2 00 0 1 478 63 32 509 978944 65536 82
3 00 0 0 0 0 0 0 0 0 00
4 00 0 0 0 0 0 0 0 0 00
它显示了第一个分区开始于柱面或磁道 0 ,磁头 1 和扇区 1 ,直到柱面 477 ,
扇区 32 和磁头 63 。因为一个磁道由 32 个扇区和 64 个读写磁头,这个分区的柱面
都是完全包括的。 Fdisk 缺省把分区对齐在柱面的边界。它从最外面的柱面( 0 )开
始向内,朝向中心轴,扩展 478 个柱面。第 2 个分区,交换分区,开始于下一个柱面
( 478 )并扩展到磁盘最里面的柱面。
在初始化的时候 Linux 映射系统中的硬盘的拓扑结构。它找出系统中有多少个硬盘
以及硬盘的类型。 Linux 还找出每一个磁盘如何分区。这些都是由 gendisk_head 指针
列表指向的一组 gendisk 数据结构的列表表达。对于每一个磁盘子系统,例如 IDE ,
初始化的时候生成 gendisk 数据结构表示它找到的磁盘。这个过程和它登记它的文件操
作和在 blk_dev 数据结构中增加它的条目发生在同一时间。每一个 gendisk 数据结构
都由一个唯一的主设备号,和块特殊设备的相同。例如, SCSI 磁盘子系统会创建一个
独立的 gendisk 条目(“ sd ”),主设备号是 8 (所有 SCSI 磁盘设备的主设备号
)。图 8.3 显示了两个 gendisk 条目,第一个是 SCSI 磁盘子系统,第二个是 IDE 磁
盘控制器。这里是 ide0 ,主 IDE 控制器。
虽然磁盘子系统在初始化的时候会建立相应的 gendisk 条目, Linux 只是在进行
分区检查的时候才用到。每一个磁盘子系统必须维护自己的数据结构,让它自己可以把
设备的主设备号和次设备号映射到物理磁盘的分区上。不管什么时候读写块设备,不管
是通过 buffer cache 或者文件操作,核心都根据它在块特殊设备文件(例如 /dev/sd
a2 )中找到的主设备号和次设备号把操作定向到合适的设备。是每一个设备驱动程序或
子系统把次设备号映射到真正的物理设备上。
8.5.1 IDE Disks ( IDE 磁盘)
今天 Linux 系统中最常用的磁盘是 IDE 磁盘( Integrated Disk Electronic )
。 IDE 和 SCSI 一样是一个磁盘接口而不是一个 I/O 总线。每一个 IDE 控制器可以支
持最多 2 个磁盘,一个是 master ,另一个是 slave 。 Master 和 slave 通常用磁盘
上的跳线设置。系统中的第一个 IDE 控制器叫做主 IDE 控制器,下一个叫从属控制器
等等。 IDE 可以从 / 向磁盘进行 3.3M/ 秒的传输, IDE 磁盘的最大