第一章 计算机系统漫游
1.1 信息就是位+上下文
- 源程序是由程序员通过编辑器创建并保存的文本文件*.c,本质上是一个由0和1组成的位(bit)序列,8个位被组织成一组,称为字节。每个字节表示程序中某个文本字符。
- 大部分现代系统都使用ASCII标准表示文本字符,每个字节都有一个整数值,对应于某个字符。只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。
- 系统中所有的信息—–包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。
1.2 程序被其他程序翻译成不同的格式
以最基本的hello.c为例。
#include <stdio.h>
int main()
{
printf(“hello,world
”);
}
在Unix系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:unix>gcc -o hello hello.c
gcc编译器驱动程序读取原程序文件hello.c,并将其翻译成一个可执行目标文件hello。这一过程经过了四个阶段。执行这四个阶段的程序(预处理器、编译器、汇编器、链接器)一起构成了编译系统。
- 预处理阶段。预处理器(cpp)根据以字符#开头的命令,修改原始的C程序,得到hello.i文件。
- 编译阶段。编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。
- 汇编阶段。汇编器(as)将hello.s翻译成机器语言指令,并把这些指令打包成一种可重定位目标程序的格式,并保存到目标文件hello.o中,它是一个二进制文件。
- 链接阶段。链接器(ld)将目标文件链接产生可执行文件hello。可执行目标文件可以被加载到内存中,由系统执行。
1.3 了解编译系统如何工作是大有益处的
有一些重要的原因是促使程序员必须知道编译系统是如何工作的,其原因如下:
- 优化程序性能。现代编译器都是成熟的工具,通常可以生成很好的代码。但我们还是需要了解汇编代码以及编译器将不同的C语句转化为机器代码的方式等等,这样才能在C程序中做出好的代码选择,从而优化程序性能。
- 理解链接时出现的错误。一些最令人困扰的程序错误往往都与链接器操作有关。比如,链接器报告说无法解析一个引用是什么意思?
- 避免安全漏洞。缓冲区溢出错误是造成了大多数网络和Internet服务器上的安全漏洞,因为太多的程序员忽视了编译器为函数产生代码的堆栈规则。
1.4 处理器读并解释存储在存储器中的指令
shell是一种命令解释器,它输出一个提示符,等待输入一个命令后执行该命令。如果该命令行的第一个单词不是一个内置的shell命令,那么shell就会假设这是一个可执行文件的命令,要价在和执行该文件。
一个典型系统的硬件组成如下图所示:
- CPU:中央处理单元
- ALU:算术/逻辑单元
- PC:程序计数器
- USB:通用串行总线
程序执行过程:
- 1.shell等待输入指令后(按回车键表示命令输入结束),将字符逐一读入寄存器,再把它存放到存储器中.
- 2.shell执行一系列指令将目标文件中的代码和数据从磁盘复制到主存,从而进行加载。
- 3.加载完成后处理器开始执行程序的main程序中的机器语言指令,这些指令将字符串的字节从存储器中拷贝到寄存器文件,再从寄存器文件中拷贝到显示设备,最终显示在屏幕上。
1.5 高速缓存
高速缓冲存储器是存在于主存与CPU之间的一级存储器,用来解决CPU和驻村之间速度不匹配问题。它的容量比较小但速度比主存高得多,接近于CPU的速度。
1.6形成层次结构的存储设备
存储器分层结构的主要思想是一个层次上的存储器作为下一层次上的存储器的高速缓存。
1.7 操作系统管理硬件
操作系统有两个基本功能:防止硬件被失控的应用程序滥用;在控制复杂而又通常广泛不同的低级硬件设备方面为应用程序提供简单一致的方法。
- 进程:它是操作系统对运行程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件(即并发运行)。
- 线程:有时被称为轻量级进程,是操作系统能够进行运算调度的最小单位。线程是进程中的一个实体,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源,同一进程中的多个线程之间可以并发执行。
- 虚拟存储器:它是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。
- 文件:它是字节序列,每个I/O设备,包括磁盘、键盘、显示器、网络等,都可以看成是文件。系统中的所有输入输出都是通过使用称为Unix I/O的一小组系统函数调用读写文件来实现的。
1.8 利用网络系统和其他系统通信
从一个单独的系统来看,网络可以视为一个I/O设备,当系统从主存将一串字符串复制到网络适配器时,数据流经过网络达到另一台机器上,不是到达本地磁盘驱动器。系统可以读取从其他机器发送来的数据,并将数据拷贝到自己的主存。
总结
第一章的内容很多是以前接触过的,通过本章学习对一些遗忘的知识进行了回顾,尤其是很多概念性的内容。而且gcc编译过程在学习linux时经常用到,本章对此也进行了回顾。正好本周的linux学习是进程的描述和创建,在学习时提到了操作系统中的进程、虚拟存储器以及文件,在这里对这些概念也有了了解。