第一章 计算机系统漫游

1.1 信息就是位 + 上下文

只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。
作为程序员,我们需要了解数字的机器表示方式,因为它们与实际的整数和实数是不同的,它们是对真值的有限近似值

1.2 程序被其他程序翻译成不同的格式

每条C语句都必须被其他程序转化为一些列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。目标程序也称为可执行目标文件。
在Unix系统上,从源文件到目标文件的转化是编辑器驱动程序完成的。
gcc -o hello hello.c

这个翻译过程分为四个阶段

  1. 预处理阶段
    预处理器cpp根据以字符#开头的命令,修改原始的C程序。比如读取#include<stdio.h> 命令告诉预处理器读取系统头文件stdio.h的内容并把它直接插入程序文本中。
  2. 编译阶段
    编译器ccl把文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。
  3. 汇编阶段
    汇编器al 把hello.s 翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并把结果保存在目标文件hello.o中。hello.o文件是一个二进制文件
  4. 链接阶段
    hello调用了printf,printf函数存在于一个名为printf.o的单独的预编译器好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中。

1.4 处理器读并解释储存在内存中的指令

shell是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令。如果该命令行的第一个单词不是内置的shell命令,那么shell就会假设这是一个可执行文件的名字,它将加载并运行这个文件。

1.4.1 系统的硬件组成

  1. 总线
    贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字。字中的字节数是一个基本的系统参数,各个系统中都不尽相同。
  2. I/O设备
    I/O设备是系统与外部世界的联系通道。主要的I/O设备:键盘 鼠标 显示器 磁盘
    每个I/O设备都通过一个控制器或适配器与I/O总线项链。控制器是I/O设备本身或者系统主印制电路板(主板)上的芯片组。适配器则是一块插在主板插槽上的卡。
  3. 主存
    主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引)。
  4. 村里器
    CPU,是解释执行存储在主存中的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器PC。在任何时候PC都指向主存中的某条机器语言指令。
    处理器从程序计数器指向的内存处读取指令,解释指令中的位,执行该命令指示的简单操作,然后更新PC,使其指向下一条指令,而这条指令并不一定和内存中刚刚执行的指令相邻。
    这样的操作围绕着主存,寄存器文件和算术/逻辑单元(ALU)进行。寄存器文件是小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字。ALU计算新的数据和地址值

CPU可能执行的操作

  • 加载: 从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容
  • 存储: 从寄存器复制一个字节或者一个字到主存的某个位置,已覆盖这个位置上原来的内容
  • 操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖该寄存器中原来的内容
  • 跳转: 从指令本身中抽取一个字,并将这个字复制到程序计数器PC中,以覆盖PC原来的值