分享

深入介绍Linux内核(二)

 快乐学习 2006-12-10
每一种系统大概可分为四个基本部分组成,见图2-l所示。其中包含有能源、输入部分、处理中心和输出部分。见图2-l所示.

电脑系统也相似,也主要由这四部分组成。稍为有点差别,就是电脑系统的处理中心与输入/输出部分的通道是共同使用的,见图2-1 (b)





电脑系统包括有硬件部分和软件部分,两者之间互相依存,缺一不可。硬件部分就是电脑系统的实体,是软件执行和储存的平台。软件是控制电脑硬件操作和动作的指令流。好象人类大脑中的讯息和思维,控制著人的行为、思考和动作一樣。我们要了解就是一个电脑系统的执行机制,阐明系统的处理中心和输入/输出部分的硬件组成原理和软件控制的实现。


如果想理解各种电脑的作业系统执行全过程,那就需要了解它的硬件执行环境。本章要介绍的是传统PC机系统的硬件组成,介绍了PC机中各个主要部分的功能。这些內容已基本能夠让你明撩Linux0.12內核的硬件基础。

可见,作业系统与所执行的硬件环境密切相关。如果想彻底理解Operation System的操作过程,那麼就需要了解它的硬件操作环境。基於传统微处理机系统的硬件组成方框图,这里介绍了微处理机中各个主要部分的功能。这些內容能夠令读者们建立起閱读Linux0.12內核的硬件基础。为了便於說明,术语PC/AT将用来指示具有80386或以上CPU的IBM PC及其相容微处理机,而PC则用来泛指所有微型个人电脑,包括IBM PC/XT了及其相容微处理机。


2.1 微型计算机组成原理

我们从俯瞰的角度来說明採用80386或以上CPU的PC机系统组成结构。一个传统微型电脑硬体组成结构见图2-2所示。其中,CPU透过位址線、资料線和控制信号線组成的本地汇流排(或称为內部汇流排)与系统其他部分进行资料通信,位址線用於提供记忆体或I/O设备的位址,即指明需要读/写资料的具体位置,资料線用於在CPU和记忆体或I/O设备之间提供资料传输的通道,而控制線则负责指挥执行的具体读/写操作。对於使用80386 CPU的PC机,其內部位址線和资料線都分別有32根,即都是32位元的。因此位址定址空间范围有232位元组,从0到4GB 。

图中上部控制器和记忆体介面通常都集成在电脑主机板上,控制器部份是以一块大型积体电路晶片为主组成的功能电路。例如,中断控制器由Intel 8259A或其相容晶片构成:DMA控制器通常採用Intel 8237A晶片构成;定时计数器的核心则是Intel 8253/8254定时晶片:键盘控制器使用的是Intel 8042晶片来与键盘中的扫描电路进行通信。





图中下方的控制卡(或者称为配接卡)则是透过扩充插槽与主机板上系统汇流排连接。汇流排插槽是系统位址汇流排、资料汇流排和控制線的与扩充设备控制器的标準连接介面。这些汇流排界面标準通常有工业标準结构ISA (Industry Standard Architecture)汇流排、扩充工业标準结构汇流排EISA (Extended ISA)、週边元件互连PCI (Peripheral速图形端口AGP(Accelerated Graphics的主要区別在於资料传输速率和控制灵活性方面。随著电脑硬体的发展,传输速率更高、控制更灵活的汇流排界面还在不断推出,例如採用串列通信点对点技术的高速PCIE(PCI Express)汇流排。最初的80386机器上只有ISA汇流排,因此系统与外部I/O设备最多只能使用16位元资料線进行资料传输。

随著电脑技术的发展,很多原来使用控制卡来完成的功能(例如硬碟控制器功能)都已经集成在电脑主机板上少数几个超大型积体电路晶片中,几个甚至是一个这樣的晶片就确定了主机板的主要特性和功能,並且为了针对不同系统部分能提供更高的传输速率,汇流排结构也发生了很大的变化。现代PC机的组成结构通常可以使用图2-3来描述。除了CPU以外,现代PC主机板主要使用2个超大规模晶片构成的品片组或晶片集(Chipsets)组成:北桥(Northbridge)晶片和南桥(Southbridge)晶片。北桥晶片用於与CPU、记忆体和AGP视讯界面,这些介面具有很高的传输速率。北桥晶片还起著记忆体控制作用,因此Intel把该晶片标号为MCH (Memory Controller Hub)晶片。南桥晶片用来管理低,中速的元件,例如,PCI汇流排、IDE硬碟介面、USB埠等,因此南桥晶片的名称为ICH (I/O Controller Hub) 。之所以用“南、北”桥来分別统称这两个晶片,是由於在Intel公司公佈的典型PC主机板上,它们分別位於主版的下端和上端(即地图上的南部和北部)位置,並起著与CPU进行通道桥接的作用。





虽然汇流排界面发生了很大变化,甚至今后北桥和南桥晶片都将会合二为一,但是对於我们程式设计人员来說,这些变化仍然与传统的PC机结构相容,因此为传统PC机硬体结构编制的程式仍然能执行於现在的PC机上,这从Intel的开发手冊上可以证实这个结论。所以为了便於入门学习,我们仍然以传统PC机结构为框架来讨论和学习PC的组成和程式设计方法,当然这些方法仍然适合於现代PC机结构。下面我们概要說明图2-2中各个主要控制器和控制卡的工作原理,而它们的实际程式设计方法则推迟到閱读內核相应原始码时再作详细介绍。


2.2 I/O端口定址和存取控制方式

2.2.1 I/O端口和定址

CPU为了存取I/O介面控制器或控制卡上的资料和状态资讯,需要首先指定它们的位址。这种位址就称为I/O 埠位址或者称为「端口」通常一个I/O控制器包含存取资料的资料端口、输出命令的命令端口和存取控制器执行状态的状态端口。端口位址的设置方法一般有两种:统一编址和独立编址。

端口统一编址的原理是把I/O控制器中的端口位址归入记忆体定址位址空间范围內。因此这种编址方式也成为记忆体映射编址。CPU存取一个端口的操作与存取记忆体的操作一样,也使用存取记忆体的指令。端口独立编址的方法是把I/O控制器和控制卡的定址空间单独作为一个独立的位址空间对待,称为I/O位址空间。每个端口有一个I/O位址与之对应,並且使用专门的I/O指令来存取端口。

IBM PC及其相容微处理机主要使用独立编址方式,採用了一个独立的I/O位址空间对控制设备中的暂存器进行定址和存取。使用ISA汇流排结构的传统PC机其I/O位址空间范围是0x000 - - 0x3FF,有1024个I/O端口位址可供使用。


各个控制器和控制卡所预设分配使用的端口位址范围见表2-1所示。关於这些端口的使用和程式设计方法将在后面具体涉及相关硬体时再详细进行說明。

另外,IBM Pc也部分地使用了统一编址方式。例如,CGA显示卡上显示记忆体的位址就直接佔用了记忆体位址空间0xB800 - - 0xBC00范围,因此若要让一个字元显示在萤幕上,可以直接使用记忆体操作指令往这个记忆体区域执行写操作。




对於使用EISA或PCI等汇流排结构的现代PC机,有64KB的I/O位址空间可供使用。在普通Linux系统下透过查看 /proc/ioports档可以得到相关控制器或设置使用的I/O位址范围,见如下所示。

[root@plinux root]# cat /proc/ioports
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyborad
0070-007f : rtc
0080-008f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : idel
01f0-01f7 : ide0
02f8-02ff : serial (auto)
0376-0376 : idel
03c0-03df : vga +
03f6-03f6 : ide0
03f8-03ff : serial (auto)
0500-051f : PCI device 8086 : 24d3 (Intel Corp.)
0cf8-0cff : PCI conf1
da00-daff : VIA Tehcnologies, Inc.VT. VT6102 [Rhine-II]
da00-daff : via-rhine
e000-e01f : PCI device 8086 : 24d4 (Intel Corp.)
e000-e01f : usb-uhci
e100-e11f : PCI device 8086 : 24d7 (Intel Corp.)
e100-e11f : usb-uhci
e200-e21f : PCI device 8086 : 24de (Intel Corp.)
e200-e21f : usb-uhci
e300-e31f : PCI device 8086 : 24d2 (Intel Corp.)
e300-e31f : usb-uhci
f000-f00f : PCI device 8086 : 24db (Intel Corp.)
f000-f007 : ide0
f008-f00f : ide1
[root@plinux root]#


2.2.7 介面存取控制

PC机I/O介面资料传输控制方式一般可採用程式回圈查询方式、中断处方式和DMA传输方式。顾名思义,回圈查询方式是指CPU透过在程式中回查询指定设备控制器中的状态来判断是否可以与设备进行资料交換。这种方式需要过多硬体支援,使用和程式设计部比较简单,但是特別耗费CPU宝贵时间因此在多工作业系统中除非等待时间极短或必须,否则就不应该使用这种方式在Linux作业系统中,只有在设备或控制器能夠立刻返回资讯时才会在很少的个地方採用这种方式。

中断处理控制方式需要有中断控制器的支援。在这种控制方式下,只有当I/O设备透过中断向CPU提出处理请求时,CPU才会暂时中断当前执行的程式转去执行相应的I/O中断处理服务过程。当执行完该中断处理服务过程后,CPU会继续执行刚才被中断的程式。在I/O控制器或设备发出中断请求时,CPU透使用中断向量表(或中断描述符表)来定址相应的中断处理服务过程的入口址。因此採用中断控制方式时需要首先设置好中断向量表,並编制好相应的中处理服务过程。Linux作业系统中大多数设备I/O控制都採用中断处理方式。

直接记忆体存取DMA (Direct Memory Access) 方式用於I/O设备与系:记忆体之间进行批量资料传送,整个操作过程需要使用专门的DMA控制器来行而无需CPU插手。由於在传输过程中无须软体介入,因此操作效率很高。Linux作业系统中,软碟驱动程式使用中断和DMA方式配合来实现资料的传输工作。


2.3主记忆体、BIOS和CMOS记忆体

2.3.1 主记忆体

1981年IBM PC刚推出时系统只带有640KB的RAM主记忆体(简称记忆体)。由於所採用的8088/8086 CPU只有20根位址線,因此记忆体定址范围最高为1024KB(1MB)。在当时DOS作业系统流行年代,640K或lMB记忆容量基本上能满足普通应用程式的执行。随著电脑软体和硬体技术的高速发展目前的电脑通常都配置有512MB或者更多的实体记忆体容量,並且都採用Intel 32位CPU,即都是PC/AT电脑。因此CPU的实体记忆体定址范围已经高达4GB (透过採用CPU的新特性,系统甚至可以定址64GB的实体记忆体容量) 。但是为了与原来的PC机在软体上相容,系统1MB以下实体记忆体使用分配上仍然保持与原来的PC机基本一致,只是原来系统ROM中的基本输入输出程式BIOS一直处於CPU能定址的记忆体最高端位置处,而BIOS原来所在的位置将在电脑开机初始化时被用作BIOS的影 (Shadow)区域,即BIOS代码仍然会被复制到这个区域中。见图2-4所示。

当电脑上电初始化时,实体记忆体被设置成从位址0开始的连续区域。除了地址从OxA0000到0xFFFFF (640K到lM共384K) 和0xFFFE0000到0xFFFFFFFF (4G处的最后一64K) 范围以外的所有记忆体都可用作系统记忆体。这两个特定范围被用於I/O设备和BIOS程式。假如我们的电脑中有16MB的实体记忆体,那麼在Linux 0.1x系统中,0--640K将被用作存放內核代码和资料。Linux內核不使用BIOS功能,也不使用BIOS设置的中断向量表。640K --1M之间的384K仍然保留用作图中指明的用途。其中位址0xA0000开始的128K用作显示记忆体缓冲区,随后部分用於其他控制卡的ROM BIOS或其映射区域,而0xF0000到1M范围用於高端系统ROM BIOS的映射区。lM-16M将被內核用於作为可分配的主记忆体区。另外高速缓冲区和记忆体虛拟碟也会佔用內核代码和资料后面的一部分记忆体区域,该区域通常会跨越640K--lM的区域。





2.3.2 基本输入/输出程式BIOS


存放在ROM中的系统BIOS程式主要用於电脑开机时执行系统各部分的自我检测,建立起作业系统需要使用的各种配置表,例如中断向量表、硬碟参数表並且把处理器和系统其余部分初始化到一个已知状态,而且还为DOS等作业统提供硬体设备介面服务。但是由於BIOS提供的这些服务不具备可重人性 (其中程式不可併发执行) ,並且从存取效率方面考虑,因此除了在初始化时会用BIOS提供一些系统参数以外,Linux作业系统在执行时並不使BIOS中功能。

当电脑系统上电开机或者按了机箱上的重定按钮时,CPU会自动把代码段存器CS设置为0xF000,其段基底位址被设置为0xFFFF0000,段长度设置64KB。而lP被设置为0xFFF0,因此此时CPU代码指标指向0xFFFFFFF0处即4G空间最后一个64K的最后16位元组处。由上图可知,这裡正是系统ROM BIOS存放的位置。並且BIOS会在这裡存放一条跳转指令JMP跳转到BIOS码中64KB范围內的某一条指令开始执行。由於目前PC/A7微处理机中BIOS容量大多有1MB到2MB,並储存在快闪记忆体(Flash Memory)ROM中,因此为了能夠执行或存取BIOS中超过64KB范围並且又远远不在0- -1M位址空间中的其他BIOS代码或资料,BIOS程式会首先使用一种称为32位元大模式 (Big Mode) 技术把资料段暂存器的存取范围设置成4G (而非原来的64K),这樣可以在0到4G范围內执行和运算资料。此后,BIOS在执行了一些列硬体检和初始化操作之后,就会把与原来PC机相容的64KB BIOS代码和资料复制记忆体低端l M末端的64K处,然后跳转到这个地方並且让CPU进入真实位模式工作,见图2-5所示。最后BIOS就会从硬碟或其他区块设备把作业系统机程式载入到记忆体0x7c00处,並跳转到这个地方继续执行开机程式。





2.3.3 CMOS记忆体

在PC/AT机中,除需要使用记忆体和ROM BIOS以外,还使用只有很少储存容量的 (只有64或128位元组) CMOS(Complementary Metal Oxide Semiconductor,互补金属氧化物半导体)记忆体来存放电脑的即时时钟资讯和系统硬体配置资讯。这部分记忆体通常和即时时钟晶片(Real Time Chip) 做在一块整合区块中。CMOS记忆体的位址空间在基本记忆体位址空间之外,需要使用I/O指令来存取。


2.4 控制器和控制卡

2.4.1 中断控制器

IBM PC/AT 80X86相容微处理机使用两片8259A可程式化中断控制晶片组成一个中断控制器,用於实现I/O设备的中断控制资料存取方式,並且能为15个设备提供独立的中断控制功能,见图2-6所示。在电脑刚开机初始化期间,ROM BIOS会分別对两片8259A晶片进行初始化,並分別把15级中断优先顺序分配给时钟计时器、键盘、串列口’列印口、软碟控制、辅助运算器和硬碟等设备或控制器使用。同时在记忆体开始处0x000-0xFFF区域內建立一个中断向量表。但是由於这些设置违背了Intel公司的要求(后面章节将会详细說明),因此Linux作业系统在內核初始化期间又重新对8259A进行了设置。有关中断控制器工作原理和程式设计方法的详细說明请参见后续章节。


===============================================
注:
那是最开始的情况,现在的计算机都已采用 APCI 来控制外部中断了,但学习和了解 8259A 仍然有它的现实意义。

==============================================






当一台PC电脑刚上电开机时,上图中的硬体中断请求号会被ROM BIOS设置成表2-2中列出的对应中断向量号。Linux作业系统並不直接使用这些PC机预设设置好的中断向量号,当Linux系统执行初始化操作时,它会重新设置中断请求号与中断向量号的对应关系。




2.4.2 DMA控制器
如前所述,DMA控制器的主要功能是透过让外部设备直接与记忆体传输资料来增强系统的效能。通常它由机器上的Intel 8237芯片或其兼容芯片实现,透过对DMA控制器进行程序设计,外设与记忆体之间的资料传输能在不受CPU控制的条件下进行。因此在资料传输期间,CPU可以做其它事情。

在PC/AT机中,使用了两片8237芯片,因此DMA控制器有8个独立的通道可使用。其中后4个是l 6位通道。软碟控制卡被专门指定使用DMA通道2。在使用一个通道之前必须首先对其设置。这牵涉到对三个埠的操作,分别是页面暂存器端口、(偏栘)地址暂存器端口和资料计数暂存器埠。由于DMA暂存器是8位的,而地址和计数值是16位值,因此各自需要发送两次。

2.4.3 定时/计数器
Intel 8253/8254是一个可程序化定时/计数器(PIT - Programmable Interval Timer)芯片,用于处理电脑中的精确时间延迟。该芯片提供了3个独立的16位计数器通道。每个通道可工作在不同的工作方式下,并且这些工作方式均可以使用软体来设置。在软体中进行延时的一种方法是执行回圈操作语句,但这样做很耗CPU时间。若机器中采用了8253/8254芯片,那么程序师就可以配置8253以满足自己的要求并且使用其中一个计数器通道达到所期望的延,在延时到后,8253/8254将会向CPU发送一个中断信号对于PC/AT及其兼容微处理机系统采用的是8254芯片。3个定时/计数器通道被分别用于日时钟计时中断信号、动态记忆体DRAM刷新定时电路和主机扬声器音调合成。Linux 0.12作业系统只对通道。进行了重新设置,使得该计数器工作在方式3下,并且每间隔10毫秒发出一个信号以产生中断请求信号(IRQ0)。这个间隔定时产生的中断请求就是Linux 0.12内核工作的时脉,它用于定时切换当前执行的任务和统计每个任务使用的系统资源量(时间) 。

2.4.4 键盘控制器
我们现在使用的键盘是IBM公司于1984年PC/AT微处理机的相容键盘,通常称为AT-PS2兼容键盘并具有10l到104个按键。键盘上有一个称为键盘编码器的处理器 (Intel 8048或兼容芯片)专门用来扫描收集所有按键按下和松开的状态资讯 (即扫描码) ,并发送到主机主机板上键盘控制器中。当一个键被按下时,键盘发送的扫描码称为接通扫描码(Make code) ,或简称为接通码;当一个被按下的键放开时发送的扫描码被称为断开扫描码(Break code) ,或简称为断开码。
主机键盘控制器专门用来对接收到的键盘扫描码进行解码,并把解码后的资料发送到作业系统的键盘资料队列中。因为每个按键的接通和断开码都是不同的,所以键盘控制器根据扫描码就可以确定用户在操作哪个键。整个键盘上所有按键的接通和断开码就组成了键盘的一个扫描码集 (Scan Code Set) ,根据电脑的发展,目前已有三套扫描码集可供使用,它们分别是:

▓ 第一套扫描码集一原始XT键盘扫描码集。目前的键盘已经很少发送这类扫描码;

▓ 第二套扫描码集一现代键盘预设使用的扫描码集,通常称为AT键盘扫描码集;

▓ 第三套扫描码集一PS/2键盘扫描码集。原IBM推出PS/2微处理机时使用的扫描码集,已很少使用。

AT键盘预设发送的是第二套扫描码集。虽然如此,主机键盘控制器为了与PC/XT机的软体兼容起见,仍然会把所有接收到的第二套键盘扫描码转换成第一套扫描码,见图2-7所示。因此,我们在为键盘控制器进行程序设计时通常只需要了解第一套扫描码集即可。这也是后面涉及键盘程序设计内容时只给出XT键盘扫描码集的原因。





键盘控制器通常采用Intel 8042单片微处理器芯片或其兼容电路。现在的PC机都已经将键盘控制器集成在主机板品片组中,但是功能仍然与使用8042晶片的控制器相兼容。键盘控制器接收键盘发送来的11位串行格式资料。其中第l位是起始位,第2- -9位是8位键盘扫描码,第l0位是奇校验校验位,第11位是停止位。参见下节对串行控制卡的说明。键盘控制器在收到11位的串行资料后就将键盘扫描码转换成PC/XT标准键盘相容的系统扫描码,然后透过中断控制器IRQ1引脚向CPU发送中断请求。当CPU回应该中断请求后,就会调用键盘中断处理程序来读取控制器中的XT键盘扫描码。

当一个键被按下时,我们可以从键盘控制器埠接收到一个XT键盘接通码。这个扫描码仅表示键盘上某个位置处的键被按下,但还没有对应到某个字符代码上,接通码通常都是一个位组宽度。例如,按下键“A” 的接通码是30(0x1E)。当一个按下的键被松开时,从键盘控制器端口收到的就是一个断开码。对于XT键盘(即键盘控制器程序设计端口收到的扫描码) ,断开码是其接通码加上0x80,即最高有效位(位7)置为位时的接通码。例如,上述“A” 键的断开码就是0x80 + 0x1E = 0x9E 。

但是对于那些PC/XT标准83键键盘以后新添加的(“扩充的”)AT键盘上的按键(例如右边的Ctrl键和右边的Alt键等),则其接通和断开扫描码通常有2到4个位组,并且第1个位组一定是0xE0。例如,按下左边的非扩展Ctrl键时会产生l位组接通码0xlD,而按下右边的Ctrl键时就会产生扩展的2位组接通码0xE0、0x1D 。对应的断开码是0xE0、0x9D 。表2-3中是几个接通和断开扫描码的例子。另外,附录中有列出了完整的第一套扫描码集。





另外,键盘控制器8042的输出埠P2用于其它目的。其P20引脚用于实现CPU的复位操作,P2l引脚用于控制A20信号线的开启与否。当该输出端口位1(P21)为1时就开启(选通)了A20信号线,为0则禁止A20信号线。现今的主机板上已经不再包括独立的8042晶片了,但是主机板上其它积体电路会为兼容目的而类比8042芯片的功能。因此现在键盘的程序设计仍然采用8042的程式设计方法。

2.4.5 串行控制卡
1. 异步串行通信原理
两台电脑/设备进行资料交换,即通信,必须象人们对话一样使用同一种语言。在电脑通信术语中,我们把电脑/设备与电脑/设备之间的“语言”称为通信协定。通信协定规定了传送一个有效资料长度单位的格式。通常我们使用术语“讯框(frame)”来形容这种格式。为了能让通信双方确定收/发的顺序和进行一些错误检测操作,除了必要的资料以外,在传输的一讯框资讯中还包含起同步和错误检测作用的其它资讯,例如在开始传输资料资讯之前先发送起始/同步或通信控制资讯,并且在发送完需要的资料资讯之后再传输一些校验资讯等,见图2-8所示。





串行通信是指在线路上以Bit位资料流程一次一个Bit进行传输的通信方式。串行通信可分为异步和同步串行通信两种类型。它们之间的主要区别在于传输时同步的通信单位或讯框的长度不同。异步串行通信以一个字符作为一个通信单位或一讯框进行传输,而同步串行通信则以多个字符或位组组成的序列作为一讯框资料进行传输。若再以人们之间的对话作比喻,那么异步通信如同对话双方讲话速度很慢,说话时一个字(word)一个字地“蹦”出来,在说出每个字后可以停顿任意长时间。而同步通信则如同通信双方以连贯的一句话作为对话单位。可以看出,实际上如果我们把传输单位缩小到一个Bit位时(对话时用字母!) ,那么以一个字元进行传输的异步串行通信也可以看作是一种同步专输通信方式。因此异步和同步通信的区分主要是一种习惯或惯例上的划分。

2. 异步串行传输格式
异步串行通信传输的讯框格式见图2-9所示。传输一个字符由起始位、等料位、奇偶校验位和停止位构成。其中起始位起同步作用,值恒为0。资料立元是传输的实际资料,即一个字符的代码。其长度可以是5- -8个Bit。奇偶校验位可有可无,由程序设定。停止位恒写为l,可由程序设定为l、1.5或2个Bit位,在通信开始发送资讯之前,双方必须设置成相同的格式。如具有相同数量的资料Bit位和停止位。在异步通信规范中,把传送l称为传号(MARK) ,传送0称为空号(SPACE) 。因此在下面描述中我们就使用这两个术语。





当无资料传输时,发送方处于传号(MARK)状态,持续发送l。若需要发差资料,则发送方需要首先发送一个Bit位问隔时问的空号起始位。接收方收到空号后,就开始与发送方同步,然后接收随后的资料。若程序中设置了奇偶校验位,那么在资料传输完之后还需要接收奇偶校验位元。最后是停止位。在一个字己讯框发送完后可以立刻发送下一个字符讯框,也可以暂时发送传号,等一会再发送字符讯框。

在接收一字符讯框时,接收方可能会检测到三种错误之一:①奇偶校验错误。此时程序应该要求对方重新发送该字符:②过速错误。由于程序取字符速度慢于接收速度,就会发生这种错误。此时应该修改程序加快取字符频率:③讯框格式错误。在要求接收的格式资讯不正确时会发生这种错误。例如在应该收到停止位时却收到了空号。通常造成这种错误的情况除了线路干扰以外,很可能是通信双方的讯框格式设置的不同。


3. 串行控制器

为实现串行通信,PC机上通常部带有2个符合RS-232C标准的串行接口,并使用通用异步接收/发送器控制品片UAR了(Universal Asynchronous Receiver/Transmitter)组成的串行控制器来处理串行资料的收发工作,PC机上的串行接口通常使用25芯或9芯的DB-25或DB-9连接器,主要用来连接MODEM设备进行工作,因此RS-232C标准规定了很多MODEM专用界面引线,以前的PC机都使用国家半导体公司的NS8250或NSl6450 UART芯片,现在的PC机则使用了16650A及其兼容芯片,但都与NS8250/16450芯片兼容。NS8250/16450与16650A芯片的主要区别在于16650A芯片还另外支持FIFO传输方式。在这种方式下,UART可以在接收或发送了最多16个字符后才引发一次中断,从而可以减轻系统和CPU的负担。当PC机上电启动时,系统RESET信号透过NS8250的MR引脚使得UART内部暂存器和控制逻辑复位。此后若要使用UART就需要对其进行初始化程序设计操作,以设置UART的工作串行传输速率、资料位数以及工作方式等。


2.4.6 显示控制


对于IBM PC/AT及其兼容电脑而言,可以使用彩色和单色显示卡。 IBM最早推出的PC机视讯系统标准有单色MDA标准和彩色CGA标准以及EGA和VGA标准。以后推出的所有高级显示卡(包括现在的AGP显示卡)虽然都具有极高的图形处理速度和智能加速处理功能,但它们还是都支持这几种标准。Linu 0.1x作业系统仅使用了这几种标准都支持的文字显示方式。

1. MDA显示标准

单色显示配接卡MDA(Monochrome Display Adapter)仅支援黑白两色显示。并且只支持独有的文字字符显示方式(BIOS显示方式7) 。其萤幕显示规格是80列X 25行(列号x = 0..79; 行号y = 0..24),共可显示2000个字元。每个字符还带有1个属性位组,因此显示一萤幕(一讯框)内容需要占4KB位元组。其中偶地址位组存放字符代码,奇地址位组存放显示属性。MDA卡配置有8KB显示记忆体。在PC机记忆体寻址范围中占用从0xb0000开始的8KB空间(0xb0000- -0xb2000)。如果显示幕行数是video_num_lines:25;列数是video_num_colums = 80,那么位于萤幕列行值x、y处的字元和属性在忆体中的位置是:

字元位元组位置 = 0x_b0000 + video_num_colums *2 * y + x *;
属性位元组位置 = 字元位元组位置 + l;

在MDA单色文本显示方式中,每个字符的属性位组格式见表2-4所示。其中,D7置1会使字符闪烁;D3置l使字符高亮度显示。它与图2-l0中的彩文本字符的属性位组基本一致,但只有两种颜色:白色(0x111)和黑色(0x000)。它们的组合效果见表所示。




2. CGA 显示标准

彩色图形配接卡CGA(Color Graphics Adapter)支持7种彩色和图形显方式(BIOS显示方式0- -6) 。在80列X 25列的文字字符显示方式下,有色和16色彩色两种显示方式(BIOS显示方式2- -3)。CGA卡标配有16KB示记忆体(占用记忆体地址范围0xb8000- -0xbc000) ,因此其中共可存放4讯框显示资讯。同样,在每一讯框4KB显示记忆体中,偶地址位组存放字元代码,奇地址位组存放字元显示属性。但在console.c程序中只使用了其中8KB示记忆体(0xb8000- -0xba000) 。在CGA彩色文字显示方式中,每个显示元的属性位组格式定义见图2-l0所示。





与单色显示一样,图中D7置1用于让显示字符闪烁;D3置l 让字符高亮度显示;Bit位D6、D5、D4和D2、Dl、DO可以分别组合出8种颜色。前景色与高亮度Bit位组合可以显示另外8种字符颜色。这些组合的颜色见表2-5所示。





3. EGA/VGA显示标准

增强型图形配接卡EGA(Enhanced Grpahics Adapter)和视讯图形阵列VGA(Video Graphics Adapter) 除兼容或支持MDA和CGA的显示方式以外,还支持其它在图形显示方面的增强显示方式。在与MDA和CGA相容的显示方式下,占用的记忆体地址起始位置和范围部分别相同。但EGA/VGA都标配有起码32KB的显示记忆体。在图形方式下占用从0xa0000开始的实体记忆体地址空间。


2.4.7 软碟和硬盘控制器

PC机的软碟控制子系统由软盘片和软碟驱动器组成。由于软碟可以储存程式和资料并且携带方便,因此长期以来软碟驱动器是PC机上的标准配置设备之一。硬盘也是由盘片和驱动器组成,但是通常硬盘的金属盘片固定在驱动器中,不可拆卸。由于硬盘具有很大的储存容量,并且读写速度很快,因此它是PC机中最大容量的外部储存设备,通常也被称为外部记忆体。软碟和硬盘都是利用磁性介质保存资讯,具有类似的储存工作方式。因此这里我们以硬盘为例来简要说明它们的工作原理。

在盘片上储存资料的基本方式是利用盘片表面上的一层磁性介质在磁化后的剩磁状态。软碟通常使用众酯薄膜作基片,而硬盘片则通常使用金属铝合金作基片。一张软碟中含有一张聚酯薄膜圆盘片,使用上下两个磁头在盘片两面读写资料,盘片旋转速率大约在300转/分钟。硬盘中通常起码包括2张或者更多张金属盘片,因此具有多个读写磁头。例如,对于包含2个盘片的硬盘中就具有4个实体磁头,含有4个盘片的硬盘中有8个读写磁头。见图2-1 l所示。硬盘旋转速率很快通常在7500转/分钟到10000转/分钟,因此硬盘资料的传输速度通常可达几十兆Bit/秒。





位于磁盘表面的磁头上有分别有一个读线圈和写线圈。在读资料数据操作过程中,磁头首先移动到旋转着的磁盘某个位置上。由于磁盘在旋转,磁介质相对磁头作匀速运动,因此磁头实际上在切割磁介质上的磁力线。从而在读线圈中因感应而产生电流,根据磁盘表面剩磁状态方向的不同,在线圈中感应产生的电流方向也不同,因此磁盘上记录着的0和1资料就被读出,从而可从磁盘上顺序读出Bit资料流程,由于磁头读取的每个磁轨上都有存放资讯的特定格式,因此透过识别所读Bit资料流程中的格式,磁盘电路就可以区分并读取磁轨上各磁区中的资料,见图2-12所示。其中,GAP是间隔栏位,用于起隔离作用。通常GAP 是12位组的0。每个磁区地址场的地址栏位存放着相关磁区的柱面号、磁头号(面号)和磁区号,因此透过读取地址场中的地址资讯就可以唯一地确定一个磁区。





为了读写磁盘(软碟和硬盘)上的资料,就必须使用磁盘控制器,磁盘控制器是CPU与驱动器之间的逻辑接口电路,它从CPU接收请求命令,向驱动器发送寻道、读/写和控制信号,并且控制和转换资料流程形式。控制器与驱动器之间傅输的资料包括图2-12中的磁区地址资讯以及定时和时钟资讯。控制器必须从实际读/写资料中分离出这些地址资讯和一些编码、解码等控制资讯。另外,与驱动器之间的资料传输是串行Bit资料流程,因此控制器需要在并列位组资料和串行比特流资料之间进行转换,PC/AT机中软碟驱动控制器FDC (Floppy Disk Controller)采用的是NEC μPD765或其相容品片。它主要用于接收CPU发出的命令,并根据命令要求向驱动器输出各种硬体控制信号,见图2-13所示。在执行读/写操作时,它需要完成资料的转换(串行一并列) 、编码和校验操作,并且时刻监视驱动器的执行状态。





对磁盘控制器的程序设计过程就是透过I/O端口设置控制器中的相关暂存器内容,并透过暂存器获取操作的结果资讯。至于磁区资料的传输,则软碟控制卡与PC/AT硬盘控制器不同。
软碟控制卡电路采用DMA信号,因此需要使用DMA控制器实施资料传输。而AT硬盘控制器采用高速资料块进行传输,不需要DMA控制器的介入。

由于软盘片比较容易遭到损坏(发霉或划伤) ,因此目前电脑中已经逐渐开始不配置软碟驱动器,起而代之的是使用容量较大并且更容易携带的USB记忆体。

本章小结
硬体是作业系统执行的基础平台。了解作业系统执行的硬体环境是深入理解执行其上作业系统的必要条件。本章根据传统微处理机的硬体组成结构,简单介绍了微处理机中各个主要部分,下一章我们从软体角度出发介绍编制Linux内核所使用的两种组合语言语法和相关编译器,同时也介绍了编制内核使用的GNU gcc语法扩充部分的内容。


注译:

Stack - 堆叠 或者称呼为 堆栈
Segment - 段
Flag - 旗标 或者称呼为 标志
暂存器又称呼为寄存器

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多