linux编程白皮书 第一章
时间:2005-05-02 来源:july17
第一章 硬件基础与软件基础
1.1 硬件基础
操作系统必须和作为起基础的硬件系统紧密地协同工作。操作系统需要只有硬件能提供的特定服务。为了完全理解linux 操作系统,需要了解她下层的硬件基础知识。本节将简短介绍该硬件:现在PC。
第一章 硬件基础与软件基础
1.1 硬件基础
操作系统必须和作为起基础的硬件系统紧密地协同工作。操作系统需要只有硬件能提供的特定服务。为了完全理解linux 操作系统,需要了解她下层的硬件基础知识。本节将简短介绍该硬件:现在PC。
当以Altair8080机器的图解作为封面的1975年1月份的《大众电子》杂志印刷时,一场“革命”开始了。家庭电子爱好者仅花397美元就可以组装出一台以早些时候的电影“星际履行”中的一个目的地而命名的Altair8080。它的Intel8080处理器和256字节的存储器而没有屏幕和键盘用今天的标准看来是多么弱小。它的发明者Ed.Roberts创造了“个人计算机”一词来描述自己的新发明,但今天PC一词被用来指几乎任何你不需帮助就可以得到的计算机。从这个定义上说,甚至一些具有强大能力的Alpa AXP系统也是PC。
狂热的黑客们看到Altair的潜力并开始为它写软件和建造硬件。对于这些早期的先行者来说,它代表着自由:不用在巨大的批处理大型机系统上运行和被“精英们”监视的自由。许多被这种新东西—— 一台可以放在家中厨房里桌子上的计算机迷住的大学辍学者一夜之间而暴富。许多硬件出现了,在某种程度上都不相同,而软件黑客很乐意为这些新机器写软件。然而IBM坚实的建造了现代PC的模型,它们1981年发布IBM PC并于1982年早期开始销售给客户。它有Intel8088处理器,64KB内存(可扩充至256KB)、两个软盘和一个25巷80字符的彩色徒刑适配器(CGA),这在今天的标准看来仍不很强大但却销售的很好。接着是1983年的IBM PC-XT,有了“奢侈”的10MB字节硬盘。不久,许多诸如Compaq这样的公司在一个不断增长的市场中一起竞争,PC的体系结构成为一个事实标准。这个事实标准有助于许多的硬件公司在一个不断增长的市场中一起竞争,从而保持价格很低,使消费者受益。这些早期PC的许多系统结构特征一起保持到当今的PC。例如,即使是最强大的基于Intel Pentium Pro的东西时,就选择了最普遍和合理价格的硬件,Intel80386 PC。
从PC的外面看来,最明显的不见是机箱、键盘、鼠标和图形监视器。机箱前面是一些按钮、一个数字的小显示器个一个软驱。现在的大多数系统有CD-ROM,并且如果你觉得有必要保护数据的话还可以有一台磁带驱动器做备份用。这些设备被统称做外设。
尽管CPU在总体上控制系统,它并非唯一的智能设备。所有的外设控制器,比如IDE控制器,都具有一定的智能。在PC内部,有一块主板,上面有CPU或称微处理器、内存条插槽和一些ISA或PCI外设控制器的插槽。有些控制器,如IDE磁盘控制器可以直接建在系统主板上。
1.1.1 CPU
CPU或叫微处理器,是计算机系统的心脏。微处理器通过从内存中读取指令并执行进行
计算、逻辑操作以及数据流管理。在早期计算中微处理器的功能部件是分离的 (物理上很大的)
单元。就是那时创造了中央处理单元 (Central Processing Units)的术语。现代的微处理器把这
些部件组合在蚀刻于很小的硅片上的集成电路中。 CPU、微处理器(microprocessor)、处理器
(processor)三个词在本书中通用。
微处理器操作由0和1组成的二进制数据,这些 0和1对应于电子开关的打开或关闭。如十
进制的42表示“4个10和2个1”,一个二进制数是表示 2的幂的一串二进制数。在这里幂是指
一个数乘以自身的次数。 10的1次幂(101)是10,10的2次幂(102)是10×10,10的三次幂(103)是
10×10×10,依此类推。二进制 0001是十进制 1,二进制 0010是十进制 2,二进制 0011是3,
二进制0100是4,等等。这样,十进制 42的二进制就是101010即(2+8+32或21+23+25)。在计算
机程序中通常不用二进制表示数据,而用另一种基数,十六进制表示。在这种表示下,每个
数位表示一个16的幂。因为十进制数只有 0到9,数10到15用字母A、B、C、D、E、F表示成
单个数位。例如,十六进制 E是十进制14,十六进制2A是十进制42(两个16加上10)。用C语言
的表示方法 (正如在本书通篇中所做的 ),十六进制要加前缀“ 0x”;十六进制数 2A被写作
0x2A。
微处理器可以进行算术运算,如加、减、乘、除和逻辑运算,如“ X是否比Y大?”。
处理器的执行被外部时钟所驱动。这个时钟,即系统时钟,产生规则的时钟脉冲到处理
器,而处理器在每一个时钟脉冲做一些工作。比如,处理器可以在每个时钟脉冲执行一条指
令。处理器的速度用系统时钟跳动的速度来描述。一个 100MHz的处理器每秒钟将收到 100
000 000个时钟脉冲。用时钟脉冲来描述 CPU的能力有误导性,因为不同的处理器在一个时钟
脉冲期间完成不同量的工作。但是,在其它所有东西都一样时,速度更快的时钟意味着计算
能力更强的处理器。处理器执行的指令都很简单,比如像“将存储器 X位置的内容读到Y寄存
器”。寄存器是微处理器的内部存储区,用来存储数据和在其上面执行操作。执行的操作可能
会引起停下它正在做的东西并跳转到存储器中其它地方的某条指令。这些微小的组成单元赋
予当今的微处理器几乎无穷的能力,它们能够每秒钟执行数百万条甚至上十亿条指令。
指令在执行前必须先从存储器中取出。指令自身可以引用存储器中的数据,该数据必须
被从存储器中取出并在适当的时候存回去。
微处理器内部的寄存器的大小、数量和类型完全取决于微处理器的类型。 Intel 80486处理
器和Alpha AXP处理器就有不同的寄存器集;首先, Intel的是32位宽,而Alpha AXP的是64位
宽。一般说来,任何微处理器都会有一定数量的通用寄存器和少量的专用寄存器。大多数处理器有以下的专用寄存器:
程序计数器(Program Counter,PC):该寄存器包含将被执行的下条指令的地址。每当一条
指令取出后PC的值将被自动增量。
栈指针(Stack Pointer,SP):处理器必须能够存取大量的外部随机读 /写存储器(RAM),以
存储临时数据。栈就是一种在外部存储器中方便地存储和恢复数据的方式。通常处理器有专
门指令让你把值压到栈上,并在晚些时候将它们弹出。栈工作于后进先出 (Last In First Out,
LIFO)的基础上。也就是说,如果你压两个值,即 X和Y到栈上,然后弹出一个值,将会得到
后压进的Y的值。
有些处理器的栈朝存储器顶端向上增长,而另一些朝存储器底端即基端向下增长。有的
处理器支持这两种,比如ARM。
处理器状态(Processor Status,PS):指令可能产生结果;比如“寄存器 X的值是否大于寄存
器Y的值”将产生真或假作为结果。 PS寄存器保存这种和其它的当前处理器的状态信息。例
如,大部分处理器至少有两种操作模式,核心 (或管理)模式和用户模式。 PS寄存器中保留有
识别当前操作模式的信息。
1.1.2 存储器
所有系统都有一个存储器层次结构,在这个层次结构的不同层上有不同速度和大小的存
储器。速度最快的存储器就是我们所知道的高速缓存。就像听起来的那样,它是用来暂时保
留或缓存主存储器内容的存储器。这种存储器速度很快但也很贵,所以大多数系统有少量的
片上(on-chip)缓存和稍多的系统级(板上)缓存。有的处理器用一个缓存保存指令和数据,但其
它的处理器有两个缓存,一个指令缓存和一个数据缓存。 Alpha AXP处理器就有两个内部缓
存:一个是数据的(D-Cache),一个是指令的(I-Cache)。外部缓存(B-Cache)将两者合在了一起。
最后是主存储器,相对于外部缓存来说是很慢的。相对于 CPU片上缓存,主存慢得就像爬一
样。
高速缓存和主存储器必须保持同步 (一致)。也就是说,如果主存储器的一个字保存在高速
缓存的一个或多个位置,则系统必须要保证高速缓存和主存储器的内容是相同的。高速缓存
一致性的工作一部分由硬件完成,一部分由操作系统完成,许多主要的系统任务也是这样,
要求硬件和软件紧密配合来达到目标。
1.1.3 总线
系统主板上的单个部件通过被称为总线 (bus)的许多系统连接通路相连。系统总线在逻辑
功能上分为三类:地址总线、数据总线和控制总线。地址总线用来为数据传送指明存储器位
置(地址)。数据总线保持传送的数据。数据总线是双向的,它允许数据读入到 CPU和从CPU写
出。控制总线包括各种各样的线路用来在系统中传送定时和控制信号。存在许多种总线,像
ISA和PCI就是连接外设到系统的常用总线方式。
1.1.4 控制器和外设
外设是实在的设备,像图形卡或磁盘。它们受系统主板上的控制器芯片或插到主板上的
控制器卡的控制。IDE磁盘用IDE控制器芯片控制、SCSI磁盘用SCSI磁盘控制器芯片控制等等
这些控制器通过一组总线连接到 CPU及相互连接。大部分现在制造的系统使用 PCI和ISA总线连接主要的系统部件。控制器是像 CPU一样的处理器,它们可以被看作 CPU的智能化助手。
CPU对系统整体进行控制。
所有的控制器都不相同,但通常都有一些寄存器控制它们。在 CPU上运行的软件必须能
够读写这些控制寄存器。一个寄存器可能包含描述出错状态的信息。另一个可能被用作控制
目的,来改变控制器的模式。总线上的每个控制器可以被 CPU单独寻址,这样软件的设备驱
动程序能够写到它的寄存器中以控制它。 IDE ribbon就是个很好的例子,它赋予你单独访问总
线上每个驱动器的能力。另一个不错的例子是 PCI总线,允许每个设备(如图形卡)独立地被访
问。
1.1.5 地址空间 系统中连接CPU和主存的总线与连接 CPU和系统的硬件外设的总线是分开的。硬件外设 所占用的存储器空间被总称为I/O空间。I/O空间本身可以再细分下去,但我们现在先不用考虑 那么多。CPU能够存取系统空间存储器和 I/O空间存储器,而控制器自身只有在 CPU的帮助下 间接地访问系统存储器。从设备的角度,比如软盘控制器,它只能看到自己的控制寄存器所 在的空间(ISA),而不能看到系统存储器。典型情况是, CPU有分开的指令访问存储器和I/O空 间。例如,可能有一条指令要“从 I/O地址0x3f0读一个字节到寄存器 X中。”CPU就是这样控 制系统的硬件外设—通过读写它们在I/O空间中的寄存器。在PC体系结构发展的这么多年里, 一般的外设(IDE控制器、串口、硬盘控制器等 )的寄存器在什么地方(地址)已经成为习惯。I/O 空间地址0x3f0正好是一个串口(COM1)的控制寄存器地址。 有时控制器需要直接读或写系统存储器中的大量数据,例如用户数据被写到硬盘时。在 这种情况下,直接存储器访问 (Direct Memory Access,DMA)控制器将被使用以允许硬件外设 直接访问内存,但这种访问是处在 CPU的严格控制和管理之下的。 |
1.1.6 时钟
所有的操作系统都需要知道时间,所以当代 PC都包含一个特殊的外设叫实时时钟 (Real Time Clock,RTC)。它提供两样东西:一个可*的日期时间和一个准确的定时间隔。 RTC有自己的电池,所以当PC断电的时候它继续运行,这就是为什么你的 PC总是知道正确的日期和时间的原因。间隔定时器允许操作系统准确地调度必需的工作。
1.2 软件基础
程序是完成特定任务的计算机指令集合。程序可以用汇编,一种很低级的计算机语言写成,也可以用高级的、与机器无关的语言比如 C语言写成。操作系统是一个特殊的程序,使用户能够运行像表格或字处理这样的应用程序。本节介绍基本编程原理并给出操作系统的功能和目标的一个概述。
1.2.1 计算机语言
1. 汇编语言
CPU从主存取出并执行的指令对于人是根本不能理解的。它们是机器代码,精确地告诉
机器干什么。十六进制数0x89E5是一条Intel 80486指令,将ESP寄存器的内容拷贝到EBP寄存
器中。为最早的计算机发明的软件工具之一是汇编器,一个输入人可读的源文件并把它汇编
成机器代码的程序。汇编语言显式地处理寄存器和对数据的操作,并且它们是针对特定微处
理器的。Intel X86微处理器的汇编语言与Alpha AXP微处理器的汇编语言有很大差别。下面的
Alpha AXP汇编代码展示了一个程序可能执行的操作:
ldr r16, (r15) : 第一行
ldr r17, 4(r15) : 第二行
beq r16,r17,100 : 第三行
str r17, (r15) : 第四行
100: : 第五行
第一个语句(第一行)从寄存器15保存的地址装载寄存器16。下一条指令从存储器下一个位置装载寄存器17。第三行比较寄存器16和寄存器17的内容,如果它们相等,就转移到标号100。如果寄存器中的值不等则程序继续执行第 4行,将寄存器17的内容存到存储器。如果寄存器确实给相同内容则不必存储任何数据。汇编程序冗长、难写而又易于出错。 Linux内核只有很少一部分是为了高效而用汇编语言写的,那些部分是针对特定微处理器的。
2. C语言和编译器 x - y;
执行和前面例子的汇编代码一模一样的操作。如果变量 x的内容和变量 y的内容不相同,
|
3. 连接器
1.2.2 什么是操作系统
1. 存储器管理
$ ps 174 pRe 1 0:00 sh /usr/X11R6/lib/bin/stattx ...... 3270 pp6 03 0:00 ps $
3. 设备驱动程序
1.2.3 内核数据结构
1. 链表 (持续更新中....) |