Chinaunix首页 | 论坛 | 博客
  • 博客访问: 100731
  • 博文数量: 3
  • 博客积分: 1430
  • 博客等级: 上尉
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-25 09:12
文章存档

2011年(1)

2008年(2)

分类: LINUX

2008-04-17 10:33:53

 每一种系统大概可分为四个基本部分组成,见图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位元的。因此位址定址空间范围有2³²位元组,从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键盘扫描码。
(汗,文章太长了,我还是给原文地址吧:  )
 
相关文章:
深入Linux内核学习文档手记二 
深入Linux内核学习文档手记三 
 
阅读(1046) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:如何建造Open WebMail伺服器(图文讲解)

给主人留下些什么吧!~~