(1)程序编译阶段
以hello world 程序为例,介绍计算机系统的基本组成结构和程序的编译过程。
#include <stdion.h> int main(){ printf("hello,world\n"); }
该程序的执行经历这样一个过程:
- 源程序首先经预处理器处理:将#include中的内容插入到源程序中,得到另一个程序hello.i
- 编译阶段:hello.i程序经过编译,变成一个汇编程序hello.s
- 汇编阶段:hello.s文本程序经过汇编器汇编,变成二进制文件,这里的字节码编码是机器码,其文件为hello.o
- 链接器:hello.o程序要经过链接阶段才能将该程序调用的库函数并入进来,结果得到可执行文件hello。
(2)系统的硬件组成
计算机的硬件组成可以分为如下几个部分:
- 总线:贯穿整个系统的一组电子管到,它携带信息字节并负责在各个部件之间传递。总线传送的字节单位是字,是系统的基本参数,不同机器之间有差异。
- I/O设备:I/O设备是系统与外界的联系通道,每个外设都是通过控制器或适配器与I/O总线连接。控制器和适配器的区别在于控制器是I/O设备的组成部分,而适配器是插在主板上的。
- 主存:主存是一个临时的存储设备。当程序运行的时候,就将程序加载到主存中。逻辑上来说,存储器是一个线性的字节数组,每个字节都有自己唯一的地址,这些地址是从零开始的。
- 处理器:处理器是解释存储在主存中指令的引擎。处理器的核心是程序计数器。
(3)hello world程序执行过程
在unix系统的shell上执行下列指令:
unix〉./hello
在键盘上输入回车键后,shell将执行一系列指令,将hello目标文件中的代码和数据从磁盘拷贝至内存,完成加载过程。处理器开始hello程序的主程序中的机器语言指令。这些指令将数据从存储器中拷贝到寄存器文件,再从寄存器中拷贝到显示器上,最终显示在屏幕上。
(4)操作系统管理硬件
shell加载和运行hello程序时,程序并没有直接访问外设, 它依靠操作系统提供服务。
操作系统提供两个基本功能:防止硬件被失控的应用程序滥用;在控制复杂而通常广泛不同的低级硬件设备方面,为应用程序提供简单一致的方法。操作系统通过几个抽象概念:进程、虚拟存储器和文件 来实现上述功能。
文件是对I/O设备的抽象,虚拟存储器是对主存和磁盘I/O设备的抽象,进程是对cpu、主存和I/O设备的抽象表示。
操作系统通过进程为客户提供一种该程序独占处理器、主存、I/O设备的假象。
1. 进程是操作系统对程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像独占使用硬件,这就是并发运行,也就是说一个进程的指令和另一个进程的指令是交错执行。操作系统实现这种交错执行的机制成为上下文切换。
操作系统保存进程运行所需的所有状态信息,即上下文,包括许多信息,,包括PC和寄存器文件到当前值。
2. 线程是一个进程的多个执行单元,每个线程都运行在进程的上下文中,共享同样的代码和全局数据。
3. 虚拟存储器为每个进程提供了一个假象:每个进程都在独占使用主存。每个进程看到的存储器都是一致的,称之为虚拟地址空间。
虚拟地址空间可以划分为以下几个部分:
程序代码和数据:可执行目标文件
堆:动态分配
共享库:存放c标准库和数学库的代码和数据的区域
栈:实现函数调用
内河虚拟存储器:内核是操作系统总是驻留在存储器的部分。
4. 文件
文件是字节序列,所有的I/O设备都可以看成文件。系统中所有的输入输出都是适用unix I/O的一小组系统函数调用读写文件实现。