参考材料:深入理解计算机系统(第3章)
1. (3.2.1)计算机machine-level programming重要的两类抽象:
一个重要抽象,是将format and behavior of a machine-level program抽象形成instruction set architecture,即ISA(指令集体系结构)
对于ISA,要有以下基本观念:IA32的ISA和x86-64的ISA,以及其他大多数ISA,在抽象时都将指令按顺序执行抽象。但是处理器的硬件可以并发地执行许多指令,并且采用了一些safeguards来确保并行执行之后的结果和一条一条顺序执行的结果一样。
第二个重要抽象,是将整个计算机中的memory system用虚拟地址来抽象,使得memory system就好像一个“连续”的字节块。要有的基本观念是,这个抽象对应的实际计算机basis是一些分离的hardware memories,和operating system software(?)
2.(3.2.1)
操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际processor memory中的物理地址
3.(3.2.2)
当一个源文件生成了'.o'的目标二进制文件后,无法直接查看。
但是还是有个查看目标代码文件内容的方法,就是对'.o'目标文件使用反汇编器(disassembler)。它的输出还是二进制文件,但是,反汇编器将这些二进制按照指令进行了分段。让我们知道哪一段是一个指令(格式上与汇编器产生的汇编文件一样,分行的)
关于ISA的指令(以IA32为例),我们要有以下基本观念:都是和编码中的基本思想相关
一是,ISA中每条指令占用字节数不等,常用的指令所需的字节数少,不太常用的指令的字节数多--》这样的话,相对于每条指令占用等长字节数的ISA,这种占用字节数不等的ISA为程序产生的总空间要更少。
二是,ISA中的指令在设计时,达到了一个效果,对于一个二进制指令串,从某个字节开始,译码的结果是唯一的,这是达到了编码理论中“唯一可译性”的要求。(如何为指令设计编码可以达到“唯一可译性”呢?可以看姜丹老师的《信息论》)。
(我想。大概正是反汇编器正是利用了唯一可译性,从而将一串指令字节序列分割开来的。)