没有合适的资源?快使用搜索试试~ 我知道了~
linux编程白皮书
需积分: 0 12 下载量 166 浏览量
2010-02-06
21:37:43
上传
评论
收藏 18.38MB PDF 举报
温馨提示
试读
357页
linux系统分析与高级编程技术,介绍了linux编程的方面,而且非常详细。linux编程爱好者的最佳参考书。
资源详情
资源评论
资源推荐
下载
第1章 硬件基础与软件基础
1.1 硬件基础
操作系统必须和作为其基础的硬件系统紧密地协同工作。操作系统需要只有硬件能提供
的特定服务。为了完全理解 L i n u x操作系统,需要了解它下层的硬件基础知识。本节将简短介
绍该硬件:现代P C 。
当以Altair 8080机器的图解作为封面的 1 9 7 5 年1月份的《大众电子》杂志印刷时,一场
“革命”开始了。家庭电子爱好者仅花 3 9 7美元就可以组装出一台以早些时候的电影“星际旅
行”中的一个目的地而命名的 Altair 8080。它的Intel 8080处理器和2 5 6 字节的存储器而没有屏
幕和键盘用今天的标准看来是多么弱小。它的发明者 Ed. Roberts创造了“个人计算机”一词
来描述自己的新发明,但今天 P C 一词被用来指几乎任何你不需帮助就可以得到的计算机。从
这个定义上说,甚至一些具有强大能力的 Alpha AXP系统也是P C 。
狂热的黑客们看到A l t a i r的潜力并开始为它写软件和建造硬件。对于这些早期的先行者来说,
它代表着自由:不用在巨大的批处理大型机系统上运行和被“精英们”监视的自由。许多被这种
新东西
—
一台可以放在家中厨房里桌子上的计算机迷住的大学辍学者一夜之间而暴富。许多硬
件出现了,在某种程度上都不相同,而软件黑客很乐意为这些新机器写软件。然而I B M坚实地建
造了现代P C的模型,它们1 9 8 1年发布IBM PC并于1 9 8 2年早期开始销售给客户。它有Intel 8088处
理器、6 4 K B内存(可扩充至2 5 6 K B )、两个软盘和一个2 5行8 0字符的彩色图形适配器( C G A ),这在
今天的标准看来仍不很强大但却销售得很好。接着是 1 9 8 3 年的IBM PC-XT,有了“奢侈”的
1 0 M B 字节的硬盘。不久,许多诸如C o m p a q这样的公司开始生产IBM PC兼容机,P C的体系结构
成为一个事实标准。这个事实标准有助于许多的硬件公司在一个不断增长的市场中一起竞争,从
而保持价格很低,使消费者受益。这些早期P C的许多系统结构特征一起保持到当今的P C。例如,
即使是最强大的基于Intel Pentium Pro的系统启动时也运行于Intel 8086的寻址模式下。当L i n u s
To r v a l d s 开始写后来成为L i n u x的东西时,就选择了最普遍和合理价格的硬件,Intel 80386 PC。
图1-1-1 典型的PC主板
ISA插槽
PCI插槽
内存条插槽
电源
电源
并口
串口1
串口2
从P C的外面来看,最明显的部件是机箱、键盘、鼠标和图形监视器。机箱前面是一些按
钮、一个显示数字的小显示器和一个软驱。现在的大多数系统有 C D - R O M ,并且如果你觉得
有必要保护数据的话,还可以有一台磁带驱动器作备份用。这些设备被统称做外设。
尽管C P U在总体上控制系统,它并非唯一的智能设备。所有的外设控制器,比如 I D E 控制
器,都具有一定的智能。在 P C 内部,有一块主板(见图1 - 1 - 1 ),上面有C P U或称微处理器、内
存条插槽和一些 I S A 或P C I 外设控制器的插槽。有些控制器,如 I D E 磁盘控制器可以直接建在
系统主板上。
1.1.1 CPU
C P U 或叫微处理器,是计算机系统的心脏。微处理器通过从内存中读取指令并执行进行
计算、逻辑操作以及数据流管理。在早期计算中微处理器的功能部件是分离的 (物理上很大的)
单元。就是那时创造了中央处理单元 (Central Processing Units)的术语。现代的微处理器把这
些部件组合在蚀刻于很小的硅片上的集成电路中。 C P U、微处理器( m i c r o p r o c e s s o r ) 、处理器
( p r o c e s s o r ) 三个词在本书中通用。
微处理器操作由 0和1组成的二进制数据,这些 0和1对应于电子开关的打开或关闭。如十
进制的 4 2 表示“4个1 0 和2个1”,一个二进制数是表示 2的幂的一串二进制数。在这里幂是指
一个数乘以自身的次数。 1 0的1次幂( 1 0
1
) 是1 0 ,1 0 的2次幂( 1 0
2
) 是1 0 ×1 0 ,1 0 的三次幂( 1 0
3
) 是
1 0 ×1 0 ×1 0 ,依此类推。二进制 0 0 0 1 是十进制1,二进制 0 0 1 0 是十进制2,二进制0 0 11 是3,
二进制0 1 0 0 是4,等等。这样,十进制 4 2的二进制就是1 0 1 0 1 0 即( 2 + 8 + 3 2 或2
1
+ 2
3
+ 2
5
) 。在计算
机程序中通常不用二进制表示数据,而用另一种基数,十六进制表示。在这种表示下,每个
数位表示一个1 6 的幂。因为十进制数只有 0到9,数1 0 到1 5 用字母A、B、C、D、E、F表示成
单个数位。例如,十六进制 E是十进制1 4 ,十六进制2 A是十进制4 2 ( 两个1 6加上1 0 ) 。用C语言
的表示方法 (正如在本书通篇中所做的 ),十六进制要加前缀“ 0 x ”;十六进制数 2 A 被写作
0 x 2 A 。
微处理器可以进行算术运算,如加、减、乘、除和逻辑运算,如“ X是否比Y大?”。
处理器的执行被外部时钟所驱动。这个时钟,即系统时钟,产生规则的时钟脉冲到处理
器,而处理器在每一个时钟脉冲做一些工作。比如,处理器可以在每个时钟脉冲执行一条指
令。处理器的速度用系统时钟跳动的速度来描述。一个 1 0 0 M H z 的处理器每秒钟将收到 1 0 0
000 000个时钟脉冲。用时钟脉冲来描述 C P U 的能力有误导性,因为不同的处理器在一个时钟
脉冲期间完成不同量的工作。但是,在其它所有东西都一样时,速度更快的时钟意味着计算
能力更强的处理器。处理器执行的指令都很简单,比如像“将存储器 X位置的内容读到Y寄存
器”。寄存器是微处理器的内部存储区,用来存储数据和在其上面执行操作。执行的操作可能
会引起停下它正在做的东西并跳转到存储器中其它地方的某条指令。这些微小的组成单元赋
予当今的微处理器几乎无穷的能力,它们能够每秒钟执行数百万条甚至上十亿条指令。
指令在执行前必须先从存储器中取出。指令自身可以引用存储器中的数据,该数据必须
被从存储器中取出并在适当的时候存回去。
微处理器内部的寄存器的大小、数量和类型完全取决于微处理器的类型。 Intel 80486处理
器和Alpha AXP处理器就有不同的寄存器集;首先, I n t e l的是3 2 位宽,而Alpha AXP的是6 4 位
宽。一般说来,任何微处理器都会有一定数量的通用寄存器和少量的专用寄存器。大多数处
第1章 硬件基础与软件基础 7
下载
理器有以下的专用寄存器:
程序计数器(Program Counter, P C ) :该寄存器包含将被执行的下条指令的地址。每当一条
指令取出后P C 的值将被自动增量。
栈指针(Stack Pointer, S P ) :处理器必须能够存取大量的外部随机读 /写存储器( R A M ),以
存储临时数据。栈就是一种在外部存储器中方便地存储和恢复数据的方式。通常处理器有专
门指令让你把值压到栈上,并在晚些时候将它们弹出。栈工作于后进先出 (Last In First Out,
L I F O ) 的基础上。也就是说,如果你压两个值,即 X和Y到栈上,然后弹出一个值,将会得到
后压进的Y的值。
有些处理器的栈朝存储器顶端向上增长,而另一些朝存储器底端即基端向下增长。有的
处理器支持这两种,比如A R M 。
处理器状态(Processor Status,PS):指令可能产生结果;比如“寄存器 X的值是否大于寄存
器Y的值”将产生真或假作为结果。 P S 寄存器保存这种和其它的当前处理器的状态信息。例
如,大部分处理器至少有两种操作模式,核心 (或管理)模式和用户模式。 P S 寄存器中保留有
识别当前操作模式的信息。
1.1.2 存储器
所有系统都有一个存储器层次结构,在这个层次结构的不同层上有不同速度和大小的存
储器。速度最快的存储器就是我们所知道的高速缓存。就像听起来的那样,它是用来暂时保
留或缓存主存储器内容的存储器。这种存储器速度很快但也很贵,所以大多数系统有少量的
片上( o n - c h i p ) 缓存和稍多的系统级(板上)缓存。有的处理器用一个缓存保存指令和数据,但其
它的处理器有两个缓存,一个指令缓存和一个数据缓存。 Alpha AXP处理器就有两个内部缓
存:一个是数据的( D - C a c h e ),一个是指令的( I - C a c h e ) 。外部缓存( B - C a c h e )将两者合在了一起。
最后是主存储器,相对于外部缓存来说是很慢的。相对于 C P U 片上缓存,主存慢得就像爬一
样。
高速缓存和主存储器必须保持同步 (一致)。也就是说,如果主存储器的一个字保存在高速
缓存的一个或多个位置,则系统必须要保证高速缓存和主存储器的内容是相同的。高速缓存
一致性的工作一部分由硬件完成,一部分由操作系统完成,许多主要的系统任务也是这样,
要求硬件和软件紧密配合来达到目标。
1.1.3 总线
系统主板上的单个部件通过被称为总线 ( b u s ) 的许多系统连接通路相连。系统总线在逻辑
功能上分为三类:地址总线、数据总线和控制总线。地址总线用来为数据传送指明存储器位
置(地址)。数据总线保持传送的数据。数据总线是双向的,它允许数据读入到 C P U 和从C P U 写
出。控制总线包括各种各样的线路用来在系统中传送定时和控制信号。存在许多种总线,像
I S A 和P C I就是连接外设到系统的常用总线方式。
1.1.4 控制器和外设
外设是实在的设备,像图形卡或磁盘。它们受系统主板上的控制器芯片或插到主板上的
控制器卡的控制。I D E磁盘用I D E控制器芯片控制、S C S I磁盘用S C S I 磁盘控制器芯片控制等等。
8 第一部分 Linux内核
下载
第1章 硬件基础与软件基础 9
下载
这些控制器通过一组总线连接到 C P U及相互连接。大部分现在制造的系统使用 P C I 和I S A 总线
连接主要的系统部件。控制器是像 C P U一样的处理器,它们可以被看作 C P U 的智能化助手。
C P U对系统整体进行控制。
所有的控制器都不相同,但通常都有一些寄存器控制它们。在 C P U 上运行的软件必须能
够读写这些控制寄存器。一个寄存器可能包含描述出错状态的信息。另一个可能被用作控制
目的,来改变控制器的模式。总线上的每个控制器可以被 C P U单独寻址,这样软件的设备驱
动程序能够写到它的寄存器中以控制它。 IDE ribbon就是个很好的例子,它赋予你单独访问总
线上每个驱动器的能力。另一个不错的例子是 P C I 总线,允许每个设备 (如图形卡)独立地被访
问。
1.1.5 地址空间
系统中连接C P U 和主存的总线与连接 C P U 和系统的硬件外设的总线是分开的。硬件外设
所占用的存储器空间被总称为 I / O 空间。I / O空间本身可以再细分下去,但我们现在先不用考虑
那么多。C P U能够存取系统空间存储器和 I / O 空间存储器,而控制器自身只有在 C P U 的帮助下
间接地访问系统存储器。从设备的角度,比如软盘控制器,它只能看到自己的控制寄存器所
在的空间( I S A ) ,而不能看到系统存储器。典型情况是, C P U 有分开的指令访问存储器和 I / O空
间。例如,可能有一条指令要“从 I / O地址0 x 3 f 0 读一个字节到寄存器 X中。”C P U 就是这样控
制系统的硬件外设
—
通过读写它们在I / O 空间中的寄存器。在P C 体系结构发展的这么多年里,
一般的外设( I D E 控制器、串口、硬盘控制器等 )的寄存器在什么地方(地址)已经成为习惯。I / O
空间地址0 x 3 f 0 正好是一个串口( C O M 1 ) 的控制寄存器地址。
有时控制器需要直接读或写系统存储器中的大量数据,例如用户数据被写到硬盘时。在
这种情况下,直接存储器访问 (Direct Memory Access,DMA)控制器将被使用以允许硬件外设
直接访问内存,但这种访问是处在 C P U 的严格控制和管理之下的。
1.1.6 时钟
所有的操作系统都需要知道时间,所以当代 P C 都包含一个特殊的外设叫实时时钟 ( R e a l
Time Clock,RT C ) 。它提供两样东西:一个可靠的日期时间和一个准确的定时间隔。 RT C 有自
己的电池,所以当P C 断电的时候它继续运行,这就是为什么你的 P C总是知道正确的日期和时
间的原因。间隔定时器允许操作系统准确地调度必需的工作。
1.2 软件基础
程序是完成特定任务的计算机指令集合。程序可以用汇编,一种很低级的计算机语言写
成,也可以用高级的、与机器无关的语言比如 C语言写成。操作系统是一个特殊的程序,使用
户能够运行像表格或字处理这样的应用程序。本节介绍基本编程原理并给出操作系统的功能
和目标的一个概述。
1.2.1 计算机语言
1. 汇编语言
C P U 从主存取出并执行的指令对于人是根本不能理解的。它们是机器代码,精确地告诉
机器干什么。十六进制数 0 x 8 9 E 5 是一条Intel 80486指令,将E S P 寄存器的内容拷贝到E B P寄存
器中。为最早的计算机发明的软件工具之一是汇编器,一个输入人可读的源文件并把它汇编
成机器代码的程序。汇编语言显式地处理寄存器和对数据的操作,并且它们是针对特定微处
理器的。Intel X86微处理器的汇编语言与 Alpha AXP微处理器的汇编语言有很大差别。下面的
Alpha AXP汇编代码展示了一个程序可能执行的操作:
第一个语句(第一行)从寄存器1 5保存的地址装载寄存器 1 6。下一条指令从存储器下一个位
置装载寄存器1 7 。第三行比较寄存器1 6 和寄存器1 7 的内容,如果它们相等,就转移到标号1 0 0 。
如果寄存器中的值不等则程序继续执行第 4行,将寄存器1 7 的内容存到存储器。如果寄存器确
实给相同内容则不必存储任何数据。汇编程序冗长、难写而又易于出错。 L i n u x 内核只有很少
一部分是为了高效而用汇编语言写的,那些部分是针对特定微处理器的。
2. C语言和编译器
用汇编语言写大型程序是困难而费时的工作。它很容易产生错误,并且产生的程序不可
移植,被限定在一个系列的微处理器上。使用像 C [7, C Programing Language]这样的机器无
关语言要好得多。C使得你可以用逻辑算法和操作的数据来描述程序。称为编译器的特殊程序
读进C程序并把它翻译成汇编语言,再从它产生针对特定机器的代码。好的编译器能够产生接
近优秀汇编程序员所写的那样高效的汇编指令。大部分 L i n u x 内核是用C语言写的。下面的 C
程序片断:
执行和前面例子的汇编代码一模一样的操作。如果变量 x的内容和变量 y的内容不相同,
那么y的内容将被拷贝到 x。C语言被组织成例程,每个例程执行一件任务。例程可以返回 C语
言所支持的任何值或数据类型。像 L i n u x 内核这样的大型程序包括许多独立的 C源程序模块,
每个模块有自己的例程和结构。这些 C源程序代码模块在一起组合成像文件系统处理这样的逻
辑功能。
C支持许多类型的变量,一个变量就是一个可以用符号名字引用的存储器位置。在上面的
片断中x和y就引用存储器的位置。程序员不管变量被放在存储器中什么地方,那是连接器
( l i n k e r )所关心的。有些变量包括不同类型的数据、整数、浮点数,还有一些是指针。
指针是包含其它变量的地址即它在存储器中位置的变量。考虑一个变量 x,可能位于内存
中地址0 x 8 0 0 1 0 0 0 0 处。你可以有一个指针 p x 指向x。p x 可能位于内存中地址 0 x 8 0 0 1 0 0 3 0 处。
p x 的值是0 x 8 0 0 1 0 0 0 0 :x的地址。
C允许你将相关的变量捆在一起成为数据结构。例如:
10 第一部分 Linux内核
下载
: 第一行
: 第二行
: 第三行
: 第四行
: 第五行
剩余356页未读,继续阅读
liranke
- 粉丝: 4789
- 资源: 72
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0