《深入理解计算机系统》笔记

第一章 计算机系统漫游

P3

以GCC编译器驱动程序为例,它读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello。这个翻译过程可分为四个阶段。

预处理阶段:预处理器根据以字符#开头的命令,修改原始的C程序,将程序代码中包含的系统头文件直接插入程序文本中。(处理结果:hello.i)

编译阶段:翻译成汇编语言程序(处理结果:hello.s)

汇编阶段:翻译成机器语言指令(处理结果:hello.o)

链接阶段:调用printf函数,printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的Hello.o程序中。链接器就负责处理这种合并。(处理结果:Hello文件,是一个可执行目标文件,或简称为可执行文件,可以被加载到内存,由系统执行)。


P5

系统的硬件组成:

1. 总线:携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字(word)。字中的字节数(即字长)是一个系统的基本参数。大多是机器中,要么4个字节(32位),要么8个字节(64位)。(所以总线是一个字一个字的传输的,一次性4个字节或8个字节)

2. I/O设备:键盘,鼠标,显示器,存储用的磁盘驱动器(磁盘)。从一个单独的系统来看,网络也可视为一个I/O设备。

3. 主存:临时存储设备,在CPU执行程序时,用来存放程序和程序处理的数据。从物理上来讲,是一组动态随机存取存储器(DRAM)芯片组成。从逻辑上来讲,是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从0开始的。

4. 中央处理单元(CPU,简称处理器):解释或执行存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。任何时候,PC都指向主存中某条机器语言指令(即含有该条指令的地址)。要么是当前正在执行的指令的地址,要么是下一刻即将执行的指令的地址。除此之外,CPU中还有,寄存器文件,是有一些单个字长的寄存器组成,每个寄存器都有唯一的名字。算术/逻辑单元(ALU),计算新的数据和地址值。

所以,CPU在指令的要求下可能会执行这些操作:加载,存储,操作,跳转(从指令本身中抽取一个字,并将这个字复制到程序计数器PC中,以覆盖PC中原来的值)。


P11

进程是操作系统对一个正在运行的程序的抽象。个人更喜欢它的狭义定义,进程是正在运行的程序的实例。

并发运行指一个进程的指令和另一个进程的指令是交错执行的。操作系统实现这种交错执行的机制称为上下文切换。

操作系统保持跟踪进程运行所需的所有状态信息。这种状态,也就是上下文,包括许多信息,比如PC和寄存器文件的当前值,以及主存的内容。


P16

Amdahl定律:当我们对系统的某一个部分加速时,其对系统整体性能的影响取决于该部分的重要性(a)和加速程度(k)。

T(new) = (1 - a)T(old) + aT(old)/k

加速比S = T(old) / T(new)


P24

大多数计算机使用8位的块,或者字节(Byte),来作为最小的可寻址的内存单位,而不是访问内存中单独的一个二进制位。

系统将随机访问存储器(DRAM),闪存,磁盘存储器,特殊硬件和操作系统软件结合起来,为程序提供一个看上去统一的字节数组,称为虚拟内存。

内存的每个字节都由一个唯一的数字来标识(每个字节都绑定一个数字),称为它的地址。所有可能地址的集合就称为虚拟地址空间。

(即用32位或64位的地址来绑定每一个8位的字节)


P25

二进制和十进制符号表示法对于描述位模式来说都不是非常方便。二进制表示法太冗长,而十进制表示法与位模式的互相转化很麻烦。替代的方法是十六进制。(hexadecimal)

在C语言中,以0x或0X开头的数字常量被认为是十六进制的数。字符‘A’到‘F’可以大写,可以小写,甚至大小写混合。


P28

无论是32位系统编译还是64位系统编译,int32_t都是4个字节,int64_t都是8个字节。


P29

在几乎所有的机器上,多字节对象都被存储在连续的字节序列,对象的地址为所使用字节中最小的地址。

大端法:最高有效字节从低地址处开始,往高地址排布

小端法:最低有效字节从高地址处开始,往低地址排布


P 40

左移运算<<,x<

右移运算分为逻辑右移和算术右移,逻辑右移是在左端补k个0,算术右移是在左端补k个最高有效位。

另外,加减运算符的优先级高于移位运算符。


P47

对于无符号位的整数(unsigned int,非负整数),用无符号数编码。B2U和U2B。一个8位的无符号二进制数,所表示的数的范围是从0到2的8次方减1。

对于有符号位的整数(int,可能负数),用补码编码。B2T和T2B。一个8位的有符号二进制数,所表示的数的范围是负2的7次方到2的7次方减1。

补码编码中,最高有效位也称为符号位,它的权重是负2的位数-1次方。

例如对于一个8位的有符号二进制数,

最小值是0x80表示负2的7次方,即-128,

要表示最大值时,就得使有负权重的最高有效位上的数字为0,剩下的位都为1,即2的7次方减1,结果就是127,

0xff表示最高权重上的负2的7次方加上剩余各位的2的7次方减1,结果就是-1。

i = 0x80;        //0x1000 0000 = 27次方 = -128

printf("%d\n", i); // -128

i = 0x7f;       //0x0111 1111 = 27次方 - 1 = 127    

printf("%d\n", i); // 127

int8_t i = 0xff; //0x1111 1111 = 27次方 + 0x111 1111 = 27次方 + 27次方 - 1 = -1

printf("%d\n", i); // -1


有符号数的其他表示方法:反码和原码。这两种表示方法中,对于数字0有两种不同的编码方式。正0和负0。

但因为几乎所有的现代机器都使用补码表示有符号数,这里暂时不多介绍。




你可能感兴趣的:(Computer,System)