第一章
1.1 信息就是位+上下文
1、源程序实际上就是一个有0和1组成的位(又称为比特)序列,这些为被组成8个一组,称为字节。每个字节表示程序中某个文本字符。
2、系统中所有的信息---包括磁盘文件、储存器中程序、储存器中存放的用户数据以及网路上传送的数据,都是由一串比特表示的。
1.2 程序被其他程序翻译成不同的格式
1、为了在系统上运行hello.c程序,每条C语句都被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打包好,并以二进制磁盘文件的形式存放起来。目标程序也称为可执行目标文件。
2、翻译过程分为4个阶段:预处理器根据以字符#开头的命令,修改为原始C程序,如读取系统文件中的stdio.h。编译器包含一个汇编语言程序,将标准的文本格式描述为一条低级机器语言指令,汇编器将指令打包成为一种叫做可重定位目标程序的格式。链接器负责处理并入,将可执行文件加载到储存器后,有系统执行。
1.3 了解编译系统如何工作是大有益处的
1、主要了解:优化程序性能、理解链接时出现的错误、避免安全漏洞。
1.4 处理器读并解释存储在存储器中的指令
1、shell是一种命令解释器
1.4.1 系统硬件组成
1、总线贯穿整个系统的一组电子管,称做总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字。
2、I/O设备是系统与外界的联系通道。每个I/O设备是通过一个控制器或适配器与I/O总线连接起来的。
3、主存是一个历史存储设备,在处理器质性时,它被用来存放程序和程序处理的数据。
4、处理器是解释存储在主存中指令的引擎。
1.4.2 执行hello程序
1.5 高速缓存
1、高速缓存存储器被用来作为暂时的集结区域,存放在不久的将来可能需要的信息。
1.6 形成层次结构的存储设备
1.7 操作系统管理硬件
1.7.1 进程
1、进程是操作系统对运行程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像独自占地使用硬件,我们称之为并发运行。
2、在任何一个时刻,系统上都只有一个进程正在运行。当操作系统决定从当前进程转移控制权到某个新进程时,它就会进行上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权转移给新进程。
1.7.2 线程
1、一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
1.7.3 虚拟存储器
1、虚拟存储器为每个进程提供了一个假象,好像每个进程都独占地使用主存。
2、每个进程看到的存储器都是一致的,称之为虚拟地址空间。
3、每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能:(1)程序代码和数据,代码和数据区是由可执行目标文件直接初始化的(2)堆,堆可以随时动态的扩展和收缩(3)共享库,存放像C标准库和数学库这样的共享库的代码和数据区域(4)栈。位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。用户栈再程序执行期间可以动态扩展和收缩。(5)内核虚拟存储器
4、基本思想是把一个进程虚拟存储器的内容存储再在磁盘上,然后用主存作为磁盘的高速缓存。
1.7.4 文件
1、文件只不过就是一个字节序列。每个I/O设备,包括磁盘、键盘、显示器。甚至于网络,都可以被看成是文件。
1.8 利用网路系统和其他系统通信
1.9 下一步
1、系统不仅仅只是硬件。系统是互相交织的硬件和系统软件的集合体。
1.10 小结
1、计算机系统是由硬件和系统软件组成的,他们共同写作以运行应用程序。
2、操作系统内核是应用程序和硬件之间的媒介。它提供三个基本的抽象概念:文件是对I/O设备的抽象概念;虚拟存储器是对主存和磁盘的抽象概念;进程是处理器、主存和I/O设备的抽象概念
第二章 信息的表示和处理
1、二值信号能够很容易的表示、存储和传输。
2、三种最重要的数字编码:无符号编码是基于传统的二进制表示法;二进制补码编码是表示有符号整数的最常见的方式,有符号整数就是为正或者为负的数字。浮点数编码表示实数的科学计数法的以二为基数的版本。
2.1 信息存储
1、大多数计算机使用8位的块,或叫做字节,来作为最小的可寻址的存储器单位,而不是访问存储中单独的位。
2、机器程序将存储器视为一个非常大的字节数组,称为虚拟存储器。存储器的每个字节都由一个惟一的数字标识,称为它的地址,所有可能地址的集合称为虚拟地址空间。
3、编译器和运行时的系统的一个任务就是将这个存储空间划分为更可管理的单元,来存放不同程序对象,也就是,程序数据、指令和控制信息。
2.1.1 十六进制表示法
1、一个字节包括8位。在进制表示法中,他的值域00000000~11111111。十六进制书写一个字节的取值范围为00~FF。
2、讲述二、八、十六进制之间的转换
2.1.2 字
1、每台计算机都有一个子长,指明整数和指针数据的标称大小。因为虚拟地址就是以这样的字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大小。
2.1.3 数据大小
1、分配字节书随着机器和编译器的不同而不同
2、可移植性的一个方面就是使程序对不同数据类型的确切大小不敏感。
2.1.4 寻址和字节序
1、从最低有效字节到最高有效字节的顺序存储对象,叫小端法,从最高有效字节到最低有效字节的顺序存储,叫做大端法。
2、字节顺序字啊不同类型的机器之间通过网络传送二进制数据时,可能会出现问题。为了避免这类问题,网络应用程序的代码编写必须遵守已建立的关于字节顺序的规则,以确保发送方机器将它内部的表示转换成网络标准。
#include
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len)
{
int i;
for(i=0;i
2.1.5 表示字串
1、在使用ASCII码作为字符码的任何系统上都将得到相同的结果,与字节顺序和字大小规则无关。
2.1.6 表示代码
1、二进制代码很少能在不同机器和操作系统组合之间移植
2.1.7 布尔代数和环
2.1.8 C中的位级运算
1、通过异或可以对俩个变量进行交换
2.1.9 C中的逻辑运算
1、如果第一个参数值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。
2.1.10 C中的位移运行
1、简括指向的方向的方向表示位移方向,左移(<<)的位数表示乘以2的次方数,右移(>>)
2.2 整数表示
1、将描述用位来编码整数的俩种不同方式:一种只能表示负数,而另一种能够表述负数、零和正数。
2.2.1 整数数据类型
1、C支持多种整型数据类型--表示有限范围的整数。
2.2.2 无符号和二进制补码编码
2.2.3 有符号数和无符号数之间的转换
2.2.4 C中有符号数和无符号数
2.2.5 扩展一个数字的位表示
2.2.6 截断数字
2.2.7 关于有符号数与无符号数的建议
2.3 整数运算
1、两个正数相加会得到一个负数,而且表达式x 1、计算机将信息编码为位(比特),通常呢组织成字节序列。 1、在用汇编代码写程序时,程序员必须明确指定程序如何管理存储器和执行计算的低级指令。 1、编译选线-O2告诉编译器使用第二级优化。 1、汇编代码只是简单地将存储器看成一个很大的、按字节寻址的数组。 2、程序存储器包含程序的目标代码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,以及用户分配的存储器块。 1、间接引用指针就是将该指针存放在一个寄存器中,然后在间接存储器引用中使用这个寄存器。 1、二元操作有两个操作数,而一元操作只有一个操作数。 1、加载有效地址指令leal实际上是movl指令的变形。 1、一元操作,只有一个操作数,既作源,也作目的。 1、除了右移操作,所有指令都不区分有符号和无符号操作数。 1、程序执行的另一个很重要的部分就是控制被执行操作的顺序。 1、跳转指令会导致执行切换到程序中一个全新的位置。跳转的目的地通常用一个标号指明。 1、switch语句提供了根据一个整数索引指进行多重分支的能力。 1、一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。 1、栈用来传递过程参数、储存返回信息、保存寄存器以供以后恢复之用,以及用于 本地存储。 1、C的一个不同寻常的特点是可以对数组中元素产生指针,并对这些指针进行运算。 1、C提供了俩种将不同类型的对象结合到一起来创建数据类型的机制:结构,用关键字struct来声明,将多个对象集合到一个单位中;联合,用关键字union来声明,允许用几种不同类型来引用一个对象。 1、能够规避C的类型系统,允许以多种类型来引用一个对象。 2、一个联合的总的大小等于它最大域的大小。 1、对齐限制简化了处理器和存储系统之间接口的硬件设计。 1、在栈中分配某个字节数组来保存一个字符串,但是字符串的长度超出了为数组分配的空间。 1、Java的目标代码是一种特殊的二进制表示,称为Java字节代码。这种代码可以看成是虚拟及的机器级程序。 1、Y86程序中的每条指令都会读取或修改处理器状态的某些部分 2、硬件和操作系统软件联合起来,将虚拟地址翻译成指明数据实际存在储存器中那个地方的实际或物理地址。 1、在硬件设计中,电子电路被用来计算位的函数,以及在各种存储器元素中存储位。 1、不用C中的位运算符&,|和~是因为逻辑门只对一个位进行操作,而不是整个字。 1、将很多的逻辑门组合成一个网,我们就能得到计算块,即组合电路。 1、各个阶段以及各阶段内执行操作的简略描述:取指、解码、执行、访存、写回、更新 1、实现所有Y86指令所需要的计算可以被组织成六个基本阶段:取指、解码、执行、访存、写回和更新PC。 1、SEQ的实现包括组合逻辑和俩中存储设备:时钟控制的寄存器和随机访问存储器。 1、取指阶段包括指令存储器硬件单元。 2、解码和写回阶段都要访问寄存器文件。 3、执行阶段包括算术/逻辑单元。 4、访存阶段的任务就是读或者写程序数据。 5、更新PC阶段会产生程序计算器的新值。 1、SEQ+没有硬件寄存器来存放程序计数器。是根据从前一条指令保存下来的一些状态信息来动态计算PC的。 1、在流水线化的系统中,待执行的任务被划分成了若干个独立的阶段。 P279 疑问 1、2.10、2.11、2.12习题的填写2.3.1 无符号加法
2.3.2 二进制补码加法
2.3.3 二进制补码的非
2.3.4 无符号乘法
2.3.5 二进制补码乘法
2.3.6 乘以2的幂
2.3.7 除以2的幂
2.4 浮点
2.4.1 二进制小数
2.4.2 IEEE浮点表示
2.4.3 数值示例
2.4.4 舍入
2.4.5 浮点运算
2.4.6 C语言中的浮点
2.5 小结
第三章 程序的机器级表示
3.1 历史观点
3.2 程序编码
3.2.1 机器级代码
3.2.2 代码示例
3.2.3关于格式的注解
3.3 数据格式
3.4 访问信息
3.4.1 操作数指示符
3.4.2 数据传送指令
3.4.3 数据传送示例
3.5 算术和逻辑操作
3.5.1 加载有效地址
3.5.2 一元和二元操作
3.5.3 移位操作
3.5.4 讨论
3.5.5 特殊的算术操作
3.6 控制
3.6.1 条件码
3.6.2 访问条件码
3.6.3 跳转指令和他们的编码
3.6.4 翻译条件分支
3.6.5 循环
3.6.6 switch语句
3.7 过程
3.7.1 栈帧结构
3.7.2 转移控制
3.7.3 寄存器使用惯例
3.7.4 过程示例
3.7.5 递归过程
3.8 数据分配和访问
3.8.1 基本原则
3.8.2 指针运算
3.8.3 数组与循环
3.8.4 嵌套数组
3.8.5 固定大小的数组
3.8.6 动态分配的数组
3.9 异类的数据结构
3.9.1 结构
3.9.2 联合
3.10 对齐
3.11 综合:理解指针
3.12 现实生活:使用GDB调试器
3.13 储存器的越界引用和缓冲区益处
3.14 浮点代码
3.14.1 浮点寄存器
3.14.2 栈的表达式求值
3.14.3 浮点数据的传递和转换操作
3.14.4 浮点算术指令
3.14.5 在过程中使用浮点
3.14.6 测试和比较浮点值
3.15 在C程序中嵌入汇编代码
3.15.1 基本的内嵌汇编
3.15.2 asm的扩展格式
3.16 小结
第4章 处理器体系结构
4.1 Y86指令集体系结构
4.2 逻辑设计与硬件控制语言HCL
4.2.1 逻辑门
4.2.2 组合电路和HCL布尔表达式
4.2.3 字级的组合电路和HCL整数表达式
4.2.4 集合关系
4.2.5 储存器和时钟控制
4.3 Y86的顺序实现
4.3.1 将处理组织成阶段
4.3.2 SEQ硬件结构
4.3.3 SEQ的时序
4.3.4 SEQ的阶段实现
4.3.5 SEQ+:重新安排计算阶段
4.4 流水线的通用原理
4.4.1 计算流水线
4.4.2 流水线操作的详细说明