此系列为读<深入理解计算机系统>的笔记,如有理解错误,望请指正.
第一章 计算机系统漫游
计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序.
1.1信息就是位+上下文
源程序实际上就是由一个值0和1组成的位(bit)序列,8个位被组织成一组,称为字节.每个字节表示程序中某个文本字符.
大部分现代系统都是有ASCII标准表示文本字符,只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件.
系统中所有的信息—–包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的.区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文.比如:在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令.
1.2程序被其他程序翻译成不同的格式
此例子为书中所写的hello.c的例子,从其生命周期分析系统的执行过程(可见原书)
在Unix系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:
unix>gcc -o hello hello.c
执行这四个阶段的程序(预处理器、编译器、汇编器、链接器)一起构成了编译系统(compilation system).
1,预处理阶段.预处理器(cpp)根据以字符#开头,修改原始的C程序.
2,编译阶段.编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序.
3,链接阶段.目标文件合并到我们的hello.o程序中,链接器就处理这种合并.得到hello文件,一个可执行目标文件,可以被加载到内存中,由系统执行.
1.3了解编译系统如何工作是大有益处的
有一些重要的原因是促使程序员必须知道编译系统是如何工作的,其原因如下:
- 优化程序性能:现代编译器都是成熟的工具,通常可以生成很好的代码.但是,为了在C程序中做出好的编码选择.我们确实需要了解一些机器代码以及编译器将不同的C语句转化为机器代码的方式.例如:while循环比for循环更有效吗?
- 理解链接时出现的错误.一些最令人困扰的程序错误往往都与链接器操作有关.例如:为什么有些链接错误直到运行时才会出现?
- 避免安全漏洞.缓冲区溢出错误是造成大多数网络和