文章目录
前言
学习计算机系统学习笔记
第一章 计算机系统漫游
1.1 信息就是"Bits"+“Context”
所有的信息都是以字节序列的方式储存数据的,每个字节包含8个只有0或者1数值的位(bit)。每个字节对应一个ASCII码来表示。每个文本行最后有一个不可见的\n
(换行符),对应整数值为10。
注意:计算机表示的数不是数的真实值,只是无限接近于真实值的有限近似值
1.2 程序被其他程序翻译成不同的格式
在Unix系统里,从源文件到目标文件的转化是由编译器驱动程序完成的:
linux>gcc -o hello hello.c
C语言文件编译系统:
预处理阶段:
cpp根据以#
开头的命令告诉预处理器读取系统头文件*.h
的内容,并把它直接插入进程序文本中,得到一个新的C程序(*.i
)
编译阶段:
ccl把文本文件`*.i` 翻译成`*.s`,它包含一个汇编语言程序。该程序包含函数main的定义:
main:
subq $8, %rsp
movl $.LC0, %edi
call puts
movl $0, %eax
addq $8, %rsp
ret
汇编阶段:
as将*.s
翻译成机器语言指令,并打包成可重定位目标程序(relocatable object program),把结果保存到*.o
中。*.o
是一个二进制文件,包含函数main的指令编码
链接阶段:
ld把使用到的存在于其他的*'.o
的函数的文件和本*.o
合并,输出可执行文件,可以被加载到内存中,由系统执行
1.3 了解编译系统如何工作是大有益处的
- 优化程序性能
调整代码
- 理解link-time errors
- 避免安全漏洞
避免buffer overflow
1.4 处理器读取并解释储存在内存中的指令
源文件已被编译系统编译成可执行文件存放于磁盘上,在Unix系统上运行该可执行文件:
linux>./hello
[output]
1.4.1 系统的硬件组成
- Buses(总线)
传送定长的字节块。常见的有4个字节(32位)和8个字节(64位) - I/O Devices(输入输出设备)
键鼠、显示器、磁盘。输入输出设备都连接在I/O bus上,I/O bus连接于I/O brige, I/O brige通过System bus和CPU里的Bus Interface,Memory Bus和Main Memory相连。 - Main Memory(主存)
DRAM(动态随机存取存储器),是一个线性的字节数组,每个字节有唯一的地址(array index)。 - Prpcessor(处理器)
CPU(central processing unit)中有一个Program counter(程序计数器)。CPU按照程序计数器指向的指令运行