gcc -o hello hello.c 完成对源代码的编译,生成可执行程序hello
这个过程虽然通过一条命令完成,但是其实经历了四个阶段
分别是预处理(cpp),编译(ccl),汇编(as),链接(ld)
预处理:hello.c经过预处理器得到hello.i(还是c程序,仍是文本文件)
编译:编译器将hello.i翻译成hello.s
汇编:汇编器根据指令集将汇编程序hello.s翻译成机器指令,得到可重定位目标文件hello.o,hello.o虽然是一个二进制文件,但还不能执行
指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。
在hello这个程序中,我们调用了printf这个函数,这个函数是标准c库中的一个函数,它在名为printf.o的文件中,链接器负责把hello.o和printf.o进行合并,得到可执行目标文件hello
在中断(shell)中输入./hello即可运行该程序(输出hello,world)
接下来了解一下计算机硬件组成
CPU:pc(计数器)实质上是一个大小为一个字的存储区域,在32位系统中,一个字是四字节,
在64位机器,一个字就是八字节,可以pc理解位就是一个存储空间,里面存放的是某一条指令的地址,在电脑运行的过程中,cpu不断地在执行pc指向的指令,然后更新pc,让它指向下一条要执行的指令(指令不一定相邻)
reg(register):临时存放变量的空间
alu:算数逻辑单元
主存(内存):内存主要存放程序指令以及数据
输入./hello,终端会将输入的程序逐一读入寄存器,处理器会把输入的hello字符串放入内存中,
输入回车,终端就知道我们完成命令的输入,然后开始执行指令来加载可执行文件hello
这些指令将hello中的数据(显示输出的“hello,world\n”)和代码从磁盘复制到内存,复制过程利用dma技术,可以不经过处理器,直接从磁盘到达内存,cpu开始执行main函数中的代码,cpu会将“hello,world\n”内存复制到寄存器,再从寄存器复制到显示器
无论是shell还是hello程序都没有直接访问键盘、显示器、磁盘等设备,真正操控硬件的是操作系统,可以把操作系统看成应用程序和硬件之间的中间层,所有应用程序对硬件的操作必须通过操作系统来完成