深入理解计算机系统
Capture One: A Tour of Computer Systems
理解hello.c的执行过程:
编译过程
C语言hello world程序的编译过程:
命令:Unix>gcc -o hello hello.c
生成hello
可执行文件
分为四个阶段 预处理
-》 编译
-》装配
-》链接
- 预处理:由预处理器(cpp)完成,处理源文件中的
#
开头的指令,修改C源程序,结果为以.i
为后缀的C源程序;
- 编译:编译器(cc1) 将文本文件
hello.i
翻译(translate)成hello.s
,其中包含了汇编语言程序(assembly-language program)。其中的每一条语句代表了一个低级的机器语言指令。
- 装配:装配器(as)将
hello.s
翻译成机器语言指令,打包成可定位目标程序(relacatable object program)并将其存储在hello.o
文件中,这是一个二进制文件,而不是文本文件。
- 链接:
printf
函数保存在由C编译器提供的printf.o
文件中,链接器(ld)将它与我们的hello.o
文件链接起来,结果是hello
可执行文件。 -
执行过程
执行命令
unix> ./hello
计算机系统的硬件结构:
- Bus:总线,在计算机的各个部分之间传递数据,通常以字(word)为单位传递信息。
- I/O Devices:输入输出设备,每一个IO设备通过控制器或者适配器连接到Bus上。控制器通常是设备上或主板上的一组芯片,适配器通常是插在主板接口上的设备(卡,card)。它们的目标都是在设备和Bus之间传递信息。
- Main Memory:主存,在程序执行是存储程序和数据,通常由DRAM组成.主存被组织成字节的线性数组,每一个字节都有自己唯一的地址,从0开始。
- Processer:处理器,执行程序的引擎,其中的程序计数器始终指向主存中的一个机器指令。
-
1,读取`hello`命令
2,将可执行文件拷贝到主存中
3,将`hello, world`字符串输出到屏幕上
计算机系统的cache和分层存储结构:
缓存的原理:局部性(locality)
分层结构中,寄存器为最上层,L0层,三级缓存分别为L1, L2, L3层。主存为L4层,等等。
主要idea是上层存储器作为其下层的缓存。
操作系统
两个目的:
- 保护硬件不受失控的应用程序的破坏;
- 提供给应用程序简单,统一的操作众多硬件的方法;
操作系统通过基本的抽象做到这一点。
- Files:对IO设备的抽象,本质是字节序列。系统中所有的输入输出都是对文件的读写。
- Virtual memory:对IO设备和主存的抽象;
- Processes:对处理器,主存和IO设备的抽象;
-
Process (进程)
进程是操作系统对一个运行的程序的抽象。处理器通过在不同的进程间切换(上下文切换 context switching)使得多个进程并发的执行;
进程虚地址空间
- 程序代码和数据:所有进程的代码都从同样的固定地址开始;
- Heap:堆,这部分空间在运行时由
malloc
和free
分配和释放;
- shared libraries:共享库,如C标准库和math库等。
- Stack:用户虚拟地址空间的最上层是栈,它在程序执行函数调用时分配,函数推出时释放;
- Kernel virtual memory:内核虚拟内存,应用程序不能读或写这部分空间,也不能直接调用其中的函数;