CSAPP 学习笔记(一)计算机系统漫游
1.1信息就是位+上下文
- hello.c程序是以字节序列的方式储存在文件中,只由ASCII字符构成称为文本文件
- 只由ASCII字符构成称为文本文件,其他所有文件称为二进制文件
- 区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文,不同上下文中,同样的字节序列可能表示一个整数浮点数字符串或者机器指令
1.2程序被其他程序翻译成不同的格式
- 在Unix系统上,从源文件到目标文件的转化石油编译器驱动程序完成的
linux> gcc -o hello hello.c
- 把源程序文件hello.c翻译成可执行目标文件hello的过程有四个阶段(预处理,编译,汇编,链接) ,分别由预处理器,编译器,汇编器,链接器一同完成,他们共同构成了编译系统(看书上图片)
- 预处理阶段:预处理器(cpp)根据#开头的命令修改原始的C程序,并得新的C程序(以.i为扩展名)
- 编译阶段:编译器(cll)将hello.i翻译成文本文件hello.s,包含一个汇编语言程序
- 汇编阶段:汇编器(as)把hello.s翻译成机器语言指令,并把这些指令打包成可重定位目标程序的格式,结果保存在hello.o(二进制文件)
- 链接阶段:hello调用了printf函数,printf函数存在于一个名为printf.o的单独的预处理好的目标文件中。有链接器(ld)把printf.o合并到hello.o当中。结果得到hello文件
1.3 了解编译系统如何工作的好处
- 优化程序性能
- 理解链接时出现的错误
- 避免安全漏洞
1.4 处理器读并解释存在内存中的指令
shell
- hello.c源程序已经被编译系统翻译成可执行文件hello并被存放在磁盘上。要想在Unix系统上运行该可执行文件,我们将它的文件名输入到称为shell的应用程序
linux> ./hello
hello, world
linux>
shell是一个命令行解释器如果命令行的第一个单词不是shell的内置命令,那么shell就会假设他是个可执行文件的名字,他将加载并执行这个文件。
硬件
- 系统硬件组成:总线,I/O设备,主存,处理器
- 总线:贯穿整个系统的一组电子管道,携带信息字节并负责在各个部件间传递(传递信息用的)通常总线被设计成传送定长的字节块(字word)。字中的字节数是一个基本的系统参数(32位4个,64位8个)
- I/O设备:系统与外部世界联系通道(鼠标键盘,显示器,磁盘),I/O通过控制器(I/O设备本身或者主印刷电路板上的芯片组)或适配器(插在主板插槽)与总线相连
- 主存:临时存储设备,处理器执行程序的时候用来存放程序和数据的,有一组动态随即存取存储器(DRAM)芯片组成
- 处理器:中央处理器(CPU)是解释(或执行)存储在主存中指令的引擎。其和行是一个代写哦啊为一个字的存储设备(或寄存器),称为程序计数器(PC),在任何时候PC都指向主存中的某条机器指令(及含有该指令的地址)。处理器从PC指向的内存处读指令,解释指令中的位,然后更新PC,使其指向下一条指令,而这些指令不一定在内存中连续
. 处理器操作主要围绕主存,寄存器文件,算数/逻辑单元进行 - 寄存器文件(register file)是一个小存储设备,由一些单个字长的寄存器组成,每个寄存器有唯一的文件。
- 算术/逻辑单元(ALU)计算数据和地址值
- CPU在指令的要求下可能执行这些操作
操作 | 具体 |
---|---|
加载 | 从主存复制一个字节或字到寄存器,以覆盖寄存器原来的内容 |
存储 | 从寄存器复制一个字节或字到主存的某个位置,覆盖主存原来的内容 |
操作 | 把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖寄存器原来内容 |
跳转 | 从指令本身抽取一个字,并将这个字复制到PC以覆盖PC原来的值 |
运行hello程序
一定要看书上的图!!!
- shell程序将字符逐一读入寄存器在把它放入内存中
- 敲了回车后,shell执行一系列指令来执行hello文件,把目标文件中的代码和数据从磁盘复制到主存(利用直接存储器DMA,跳过处理器,直接从磁盘到达主存)
- hello中的代码和数据被加载到主存,处理器开始执行hello程序main。字符串从主存复制到寄存器文件,再从寄存器文件复制到显示设备