第二章 软件基础
程序是执行某个特定任务的计算机指令集合 。程序可以用多种程序语言来编写:从低级计算机语言-汇编语言到高级的、与机器本身无关的语言入C程序语言 。操作系统是一个允许用户运行如电子表格或者字处理软件等应用程序的特殊程序 。本章将介绍程序设计的基本原则,同时给出操作系统设计目标与功能的概述 。
2.1 计算机编程语言
2.1.1 汇编语言
那些CPU从主存读取出来执行的指令对人类来说是根本不可理解的 。它们是告诉计算机如何准确动作的机器代码 。在Intel 80486指令中16进制数0x89E5表示将ESP寄存器的内容拷入EBP寄存器 。为最早的计算机设计的工具之一就是汇编器,它可以将人们可以理解的源文件汇编成机器代码 。汇编语言需要显式的操作寄存器和数据,并且与特定处理器相关 。比如说Intel X86微处理器的汇编语言与Alpha AXP微处理器的汇编语言决然不同 。以下是一段Alpha AXP汇编指令程序:
ldr r16, (r15); Line 1
ldr r17, 4(r15) ; Line 2
beq r16,r17,100 ; Line 3
str r17, (r15); Line 4
100:; Line 5
第一行语句将寄存器15所指示的地址中的值加载到寄存器16中 。接下来将邻接单元内容加载到寄存器17中 。第三行语句比较寄存器16和寄存器17中的值,如果相等则跳转到标号100处,否则继续执行第四行语句:将 寄存器17的内容存入内存中 。如果寄存器中值相等则无须保存 。汇编级程序一般冗长并且很难编写,同时还容易出错 。Linux核心中只有很少一部分是用汇编语言编写,并且这些都是为了提高效率或者是需要兼容不同的CPU 。
2.1.2 C编程语言和编译器
用汇编语言编写程序是一件困难且耗时的工作 。同时还容易出错并且程序不可移植:只能在某一特定处理器 家族上运行 。而用C语言这样的与具体机器无关的语言就要好得多 。C程序语言允许用它所提供的逻辑算法来 描叙程序同时它提供编译器工具将C程序转换成汇编语言并最终产生机器相关代码 。好的编译器能产生和汇编语言程序相接近的效率 。Linux内核中大部分用C语言来编写,以下是一段C语言片段:
if (x != y)
x = y ;
它所执行的任务和汇编语言代码示例中相同 。如果变量X的值和变量Y的不相同则将Y的内容赋予X 。C代码被 组织成子程序,单独执行某一任务 。子程序可以返回由C支持的任何数据类型的值 。较庞大的程序如Linux 核心由许多单独的C源代码模块组成,每个模块有其自身的子程序与数据结构 。这些C源代码模块将相关函数组合起来完成如文件处理等功能 。C支持许多类型的变量,变量是一个通过符号名称引用的内存位置 。在以上的例子中,X和Y都是内存中的位置 。程序员并不关心变量放在什么地方,这些工作由连接程序来完成 。有些变量包含不同类型的数据,整数和浮点数,以及指针 。指针是那些包含其他数据内存位置或者地址的变量 。假设有变量X,位于内存地址0x80010000处 。你可以使用指针变量px来指向X,则px的值为0x80010000 。C语言允许相关变量组合起来形成数据结构,例如:
struct {
int i ;
char b ;
} my_struct ;
这是一个叫做my_struct的结构,它包含两个元素,一个是32位的整数i,另外一个是8位的字符b 。
2.1.3 连接程序
连接程序是一个将几个目标模块和库过程连接起来形成单一程序的应用 。目标模块是从汇编器或者编译器中产生的机器代码,它包含可执行代码和数据,模块结合在一起形成程序 。例如一个模块可能包含程序中所有的数据库函数而另一个主要处理命令行参数 。连接程序修改目标模块之间的引用关系,使得在某一模块中引用的数据或者子程序的确存在于其他模块中 。Linux核心是由许多目标模块连接形成的庞大程序 。
推荐阅读
- 认识Linux操作系统下三大便利开源防火墙
- 如何在Linux中设置磁盘限额?
- Linux下的各种备份方法汇总
- Linux 内核解读入门
- linux使用经验点滴
- 安装 Linux 无盘工作站
- FONTS Linux中的字型设定
- 在Linux中限制用户空间
- 深 入Linux 的LILO
- Linux中IP隧道的分析与建议