LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2691|回复: 1

深入学习Linux内核文档一(结合图文讲解)

[复制链接]
发表于 2008-4-21 20:12:22 | 显示全部楼层 |阅读模式
每一种系统大概可分为四个基本部分组成,见图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处,並跳转到这个地方继续执行开机程式。

汗,文章太长了,我还是给原文章地址,大家点进去看.http://www.unix5.com/kaifa/kernel/20080415/376_2.html


相关文章:

深入学习Linux内核文档二(结合图文讲解)


深入学习Linux内核文档三(结合图文讲解)
 楼主| 发表于 2008-4-21 20:16:19 | 显示全部楼层
噫 我发的文章里的图片怎么显示不出来了???郁闷.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表