第一部分:简介
第一章:温故而知新
1.1 从Hello World说起
如果我们深入思考一个简单的HelloWorld程序,就会发现很多问题看似很简单,但实际上我们并没有一个很清晰的思路。
- 程序为什么要被编译器编译了之后才可以运行?
- 编译器在把C语言程序转换成可以执行的机器码的过程中做了什么,怎么做的?
- 最后编译出来的可执行文件里面是什么?除了机器码还有什么?它们怎么存放的,怎么组织的?
- #include< stdio.h>是什么意思?把stdio.h包含进来意味着什么?C语言库又是什么?它怎么实现的?
- 不同的编译器(Microsoft VC、GCC)和不同的硬件平台(x86、SPARC、MIPS、ARM),以及不同的操作系统(Windows、Linux、UNIX、Solaris),最终编译出来的结果一样吗?为什么?
- Hello World程序是怎么运行起来的?操作系统是怎么装载它的?它从哪儿开始执行,到哪儿结束?main函数之前发生了什么?main函数结束以后又发生了什么?
- 如果没有操作系统,Hello World程序可以运行吗?如果要在一台没有操作系统的机器上运行Hello World需要什么?应该怎么实现?
- printf怎么实现的?他为什么可以有不定数量的参数?为什么它能够在终端上输出字符串?
- Hello World程序在运行时,它在内存中是什么样子的?
随着各个章节的逐步展开,我们会从最基本的编译、静态链接到操作系统如何装载程序、动态链接及运行库和标准库的实现,甚至一些操作系统的机制,深入浅出地将这些问题层层剥开。
1.2 万变不离其宗
计算机多如牛毛的硬件设备中,有三个部件最为关键,分别是中央处理器CPU、内存和I/O控制芯片
1.3 站得高,望得远
计算机系统软件的整个体系结构从上到下都是按照严格的层次结构设计的。
从整个层次结构上来看,开发工具与应用程序是属于同一个层次的,因为它们都使用一个接口,那就是操作系统应用程序编程接口(Application Programming Interface)。应用程序接口的提供者是运行库,什么样的运行库提供什么样的API,比如Windows的运行库提供Windows API。
运行库使用操作系统提供的系统调用接口(System call Interface),系统调用接口在实现中往往以软件中断的方式提供
操作系统内核层对于硬件层来说是硬件接口的使用者,而硬件是接口的定义这,硬件的接口往往被叫做硬件规格
1.4 操作系统做什么
操作系统的一个功能是提供抽象的接口,另外一个主要功能是管理硬件资源
Comments