欢迎来到小护士读书笔记系列之《深入理解计算机系统》第一章计算机系统漫游(一)。
本章之所以称之为漫游,是因为作者将会以“hello world”小程序的执行始末把整个系统调度应用程序的过程给讲得明明白白。如果你看完还不明白第一章在讲什么,那么小护士也建议你可以转行了。
下面小护士把第一章的重点划出来吧。(N个小重点+三个大重点)
这小节讲了那么多就说为了说明一件事:
文本文件里面的代码其实是由ASCII码字符组成的,但其实际存储的是一堆ASCII码表与字符相对应的数字。因此,计算机读取该文本文件时,把它转为二进制数据放在计算机自己的脑袋里。那对于非文本文件的文件呢,它们本来就是纯二进制数据文件。
题外话:字符 i 表示 105, 一个byte最多表示255, 一个字符用一个byte来存,一个byte用8个bit来存,32位CPU的字为4个byte即32个bit…..点到即止,欲知真相请往下看 :)
这小节简直就是《编译原理》的概述,不服来战:
下面是12345步简记:
( 1 ) 预处理器,读取源码文件,把类似#include
代码做源码拼接,即把那个头文件跟当前文件复制粘贴在一起。输出临时文件hello.i
。
( 2 ) 编译器,把拼接好的源码进行编译,把C语言代码编译为汇编语言代码。输出临时文件hello.s
。
( 3 ) 汇编器,把汇编代码转为机器语言指令并打包到hello.o
这个小护士大二那些年教科书称为“目标程序”的文件,它全名其实叫可重定位目标程序(relocatable object program),感觉被大学老师欺骗了感情。
( 4 ) 链接器,把那些C语言标准库的函数所对应的可重定位目标程序合并到hello.o
中。什么是标准库的函数?例如,printf()
这种无需#include
进来的。
( 5 ) 还是链接器,把刚才合并好的hello.o
输出为hello
可执行文件,在Windows下,它就是hello.exe
啦。
上面提及到的C语言和汇编语言,其实在后面的章节中也会逐一慢慢地透露这两门语言那些年的千丝万缕且不为人知的秘密。
1.3 就安利了一下为啥要了解编译系统,小护士也明白这道理,看《编译原理》是大后期的是事情了,在此之前除了要看完本系列的《深入理解计算机系统》一书以外,还要经历阅读《算法导论》这个愉快而又痛苦的过程呢。至于《计算机体系结构:量化研究方法》和《计算机组成与设计:硬件/软件接口》这种就是选读了,小护士表示学不动了,蓝瘦香菇。
1.4 其实就是《计算机组成原理》的小概述。总线、I/O设备、主存、处理器,各施其职。如果你还不知道这些大概是干嘛的,小护士再次建议你可以转行了。
这个小节文字描述很少,但句句真言,小护士决定全文引用一下,方便复习。图就不画了,自己买书看。
这里先补充 1.4 的示例:
linux> ./hello
hello, world
linux>
示例描述:用户在命令行输入./hello
,按回车,显示hello, world
字符串,shell继续等待用户输入。
下面是1.4.2小节部分原文:
初始时,shell程序执行他的指令,等待我们输入一个命令。当我们在键盘上输入字符串”./hello”后,shell程序将字符逐一读入寄存器,再把它存放到内存中。
接着,
当我们在键盘上敲回车键时,shell程序就知道我们已经结束了命令的输入。然后shell执行一系列指令来加载可执行的hello文件,这些指令将hello目标文件中的代码和数据从磁盘复制到内存。数据包括最终会被输出的字符串“hello, world\n”。
而且,
利用直接存储器存取(DMA,将在第6章中讨论)技术,数据可以不通过处理器而直接从磁盘到达主存。
最后,
一旦目标文件hello中的代码和数据被加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令。这些指令将“hello, world\n”字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。
第一章上半部分其实就是讲讲程序从编译到运行的过程,而在下半部分则是介绍计算机硬件与操作系统之间的抽象关系,而这部分将在小护士读书笔记系列之《深入理解计算机系统》第一章计算机系统漫游(二)中放送,别走开哦。