计算机系统由硬件和系统软件组成。
从 hello.c 开始
来看下面一组代码:
#include<stdio.h>
int main(){
pritnf("hello, world\n");
return 0;
}
- 我们通过编辑器创造并保存了上述 c 语言文件,其文件名为 hello.c, 文件是由一些字符序列组成的,现代计算机用 ASCII 标准来表示字符,每个字符可以被转化为 8 个位(又称为比特,即 0 或 1 表示的数值,8 个位组成一个字节)。这种存储方式说明了一个基本思想:计算机中所有的信息都是由一串比特组成的。
- 为了让机器运行 hello.c 文件,计算机需要把 c 语言翻译为计算机可以执行的文件,这个翻译过程可以分为四个阶段,分别是预处理阶段–>编译器–>汇编器–>链接器。预处理阶段根据源文件中 ‘#’ 开头的命令,将 stdio.h 文件中的内容直接插入到程序文本文件,此时得到另外一个 c 程序,通常以 .i 作为文件扩展名;编译器阶段将 .i 文件翻译成汇编语言程序(见下);汇编阶段将生成的汇编程序翻译成机器语言指令,同时将这些指令打包成可重定位目标程序的格式,并以 .o 后缀进行存储;链接阶段将函数,例如将 printf 函数文件整合到 .o 文件中,最终生成可执行文件 hello,被加载到内存中,由系统执行。
main:
subq $8, %rsp
movl $.LCO, %edi
call puts
movl $0, %eax
addq $8, %rsp
计算机系统硬件组成
- 总线:携带信息字节并负责在各个部件之间传输。通常总线被设计成传输定长的字节块,即字( word), 每个系统中字的长度定义不尽相同。
- I/O 设备:系统与外界联系的通道,每个 I/O 设备都通过一个控制器或适配器与 I/O 总线总线相连。
- 主存:由 DRAM 组成,是一个临时存储设备。处理器执行程序时,用来存放程序和程序的数据。
- 中央处理单元:即 CPU, 用来解释/执行存储在主存中指令的引擎。其核心是一个大小为一个字的寄存器(程序计数器,存储当前机器语言指令的地址)。
hello.c 的运行
在 shell 中输入以下指令:
linux> ./hello #加载并运行可执行文件
hello,world #执行结果
存储设备的层次结构
操作系统管理硬件
操作系统的两个基本功能:1. 防止硬件被失控的程序滥用;2. 向应用程序提供简单一致的机制来控制复杂的硬件设备。
进程:操作系统对一个正在运行的程序的一种抽象;
并发运行:多个进程交替执行。
并行运行:多个进程同时执行。
上下文:操作系统保持跟踪进程运行所需要的状态信息,例如 PC、寄存器的当前值,主存的内容等。
上下文切换:切换进程时候,操作系统会保存当前进程的上下文,并恢复新进程的上下文。
线程:一个进程可能存在多个线程,每个线程都存在于进程的上下文中,并共享代码和全局数据。
虚拟内存:
虚拟地址空间:
文件:即字符序列。