一 计算机系统漫游
1.1 信息就是位+上下文
C语言源程序是以字节序列的方式存储在文件中的,每个字节对应一个ASCⅡ编码,例如第一个字节整数值位35,对应字符 '#'
一个基本思想:系统中的所有信息,包括磁盘文件,内存中的程序,用户数据,网络上传输的数据都是比特流。区分不同数据对象的唯一方法是读到这些数据对象时的上下文,根据不同的上下文,某个字节的信息可能表示机器指令或者是数值数据。
1.2 程序被其他程序翻译成不同格式
程序的编译流程:
预处理阶段:预处理器(cpp)根据#include<stdio.h>读取系统头文件stdio.h的内容,并将它直接插入程序文本中,得到另一个C程序,通常以.i为拓展名
编译阶段:编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,hello.s为汇编指令文本
汇编阶段:汇编器(as)将hello.s翻译为机器指令,把这些指令打包为可重定位目标程序的格式,保存至hello.o(二进制)中
链接阶段:hello.c程序调用了printf函数,printf函数存在于一个名为printf.o的单独预编译好了的目标文件中,连接器便负责将hello.o和printf.o合并,成为可执行文件hello
1.4 处理器读取并解释存储在内存中的指令
通过shell可执行刚才生成的可执行文件hello
1.4.1 系统的硬件组成
系统主要由四个部分组成:总线、IO设备、主存、处理器
总线通常被设计成传送定长的字节块(字),IO设备通常包含键盘鼠标、显示器、磁盘驱动器、打印机等。主存是一个临时存储设备,由一组动态随机存取存储器芯片组成,从逻辑上来说,可以将存储器理解为线性的数组。中央处理单元CPU是执行主存中指令的引擎,处理器组成包括:寄存器文件、算术逻辑单元、cache、总线接口等
1.4.2 运行hello程序
在shell中执行./hello命令后,shell执行一系列指令将hello目标文件中的二进制指令从磁盘复制到主存,利用直接存储器存取(DMA)技术,数据可以不通过处理器而直接从磁盘到达主存。当目标文件hello被加载到主存中,处理器开始执行main程序中的机器语言指令,将“hello,world\n”字符串的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终输出在屏幕上。
1.5 高速缓存
由于从主存到处理器、主存到磁盘的数据加载会花费大量的时间,由此设计出了高度缓存cache,集成在处理器中
L1高速缓存:通常容量达到数万字节,访问速度几乎和访问寄存器文件一样快
L2高速缓存:容量达到数十万到百万字节,访问L2缓存的速度比L1更慢,但仍比访问主存快
将一些可能经常访问的数据缓存在cache中,能够大大提升性能
1.6 存储设备形成层次结构
从上至下,访问速度越来越慢,容量越来越大。上一层存储器作为下一层存储器的高速缓存。
标签:CSAPP,字节,读书笔记,主存,程序,指令,处理器,hello From: https://www.cnblogs.com/yx12789/p/16711008.html