深入理解计算机系统 ch1-计算机系统漫游 Part1
1.1 信息就是位+上下文
像hello.c这样的只由ASCⅡ码字符构成的文件称为文本文件。所有其他文件称为二进制文件。
hello.c的表示方法说明了一个基本思想:系统中所有的信息——包括磁盘文件,内存中的程序,内存存放的用户数据以及网络上传送的数据,都是由一串比特表示。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,一个同样的字节序列可能表示一个整数,浮点数,字符串或者机器指令。
1.2 程序被其他程序翻译成不同的格式
在Unix系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:
linux> gcc -o hello hello.c
在这里,GCC编译器驱动程序读取源程序文件hello.c ,并把它翻译成一个可执行目标文件hello. 这个翻译过程可分为四个阶段,执行这四个阶段的程序(预处理器,编译器,汇编器和链接器)一起构成了编译系统(compilation system)
•预处理阶段 预处理器(cpp)根据字符#开头的命令,修改原始的C程序,得到hello.i(修改了的源程序(文本))
•编译阶段 编译器(ccl) 将文本文件hello.i 翻译成文本文件hello.s ,它包含一个汇编语言程序。该程序包含函数main的定义
• 汇编阶段 汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件hello,o中。hello.o是一个二进制文件
• 链接阶段 printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.o的程序中。连接器(ld)就负责处理这种合并。结果就得到一个可执行目标文件,被加载到内存中,由系统执行。
旁注:GNU项目 GCC是GNU项目开发出发出来的众多有用工具之一。GNU环境包括EMACS编辑器,GCC编译器,GDB调试器,汇编器,链接器,处理二进制文件的工具以及其他一些部件。
1.3 了解编译系统是如何工作的是大有益处的
•优化程序性能
•理解链接时出现的错误:链接器报告无法解析一个引用,这是什么意思?静态变量和全局变量的区别是什么?如果在不同的C文件定义了名字相同的两个全局变量会发生什么?静态库和动态库的区别是什么?为什么有些链接错误知道运行时才会出现?
•避免安全漏洞。多年来,缓冲区溢出错误是造成大多数网络和Internet服务器上安全漏洞的主要原因。
1.4 处理器读取并解释储存在内存中的指令
要想在Unix系统上运行该可执行文件,我们将它的文件名输入到称为shell的应用程序中
shell是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令。
1.4.1 系统的硬件组成
1.总线 贯穿整个系统的一根电子管道,称为总线,它携带信息字节并负责在各个部件间的传递。通常被设计成传送定长的字节快,也就是字(word)。
2 I/O 设备 I/O设备是系统与外部世界的联系通道。 每个I/O设备都通过一个控制器或适配器与I/O总线相连。控制器和适配器的差别主要在于封装方式。
3 主存(Main memory) 主存是一个临时存储设备。由一组动态随机存取存储器(DRAM)芯片组成。
4 处理器 中央处理单元(CPU) 是解释或执行存储在主存中指令的引擎。 其核心是一个大小为一字节的存储设备(或寄存器),称为程序计数器(PC)。在任何时候,PC都指向主存中某条机器语言指令。
详见P6