《深入理解计算机系统:第三章》读书笔记(一)
正如第一章所讲到的那样,了解编译系统是如何工作会给程序员带来如下的益处:优化程序的性能、理解链接时出现的错误、避免安全漏洞 。那么,如果要了解编译系统,我们就必定得先知道程序在机器上是如何表示的,表示的形式有哪些,以及在每种形式之间是如何转化的。
表示形式
-
机器语言
计算机执行机器代码,用字节序列编码低级的操作,包括处理数据、管理存储器、读写存储设备上的数据,以及利用网络通信。
-
高级语言
编译器基于编程语言的规则、目标机器的指令集和操作系统遵循的规则,经过一系列的阶段产生机器代码。
-
汇编语言
GCC C语言编译器以汇编代码的形式生产输出,汇编代码是机器代码的文本表示。然后GCC调用汇编器和链接器,从而根据汇编代码生成可执行的机器代码。
高级语言与汇编语言的比较
- 高级语言更加的抽象,屏蔽了更多细节,机器级的实现。
- 高级语言工作效率比较高,更可靠,比如高级语言的类型检查机制。
- 高级语言可以跨平台,一处编写,到处运行。
汇编语言与机器代码的重要性
- 通过能够读懂并且理解汇编代码,分析代码隐含的低效率,提高代码的运行效率。
- 了解有关程序运行时的行为信息,比如线程相关的并发程序。
- 了解漏洞是如何出现以及如何很好的防御它们。
本章的结构概览
- 快速浏览C语言、汇编语言以及机器代码之间的关系。
- 介绍IA32的细节,从数据的表示和处理以及控制的实现开始。
- 讲过程的实现,包括程序如何维护一个运行栈来支持过程间数据和控制的传递,以及局部变量的存储。
- 机器级如何实现像数组、结构和联合这样的数据结构。
- GDB调试器检查机器级程序运行时行为的技巧。
摘录
-
常见的x86系列处理器
8086处理器,80286处理器,i386处理器,i486处理器,core i5处理器,core i7处理器
-
32位机器与64位机器的存储空间
32位机器只能使用大概4GB(232字节)的随机访问存储器,而目前的64位机器能够使用多达256TB(248字节)的内存空间。
-
摩尔定律
Gordon Moore,Intel 公司创始人,在1965年预测,未来10年,芯片上的晶体管数量每年都会翻一番。(后来证实,该预测有点乐观并且短视,据统计,在超过45年中,半导体工业一直能够是晶体管数目每18个月翻一番。)
程序编码
- 机器级代码的两种抽象
- 指令集体系结构
- 它表示的是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。
- 将程序的行为描述成好像每条指令是按顺序执行的,一条指令结束,下一条再开始。
- 虚拟存储器
- 机器级程序使用的存储地址是虚拟地址,提供的存储器模型看上去是一个非常大的字节数组。
- 操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储器中的物理地址。
- 指令集体系结构