HelloWorld生命周期

今天这篇博客,我们就来较为深入的了解一下:当你在Linux系统执行了hello程序后,系统到底发生了什么。
如果觉得博客讲的不好,可以直接看书:

深入理解计算机系统PDF:[https://pan.baidu.com/s/1bOfnYWg_GnskTc5V5VGeXg]

1. hello程序从源文件开始的。

此阶段的任务就是完成编辑hello.c文件。
1729668-20190902214508510-755204746.png

2. hello.c经过编译器驱动程序转化成可执行文件

1729668-20190902225045407-809858953.png
当源文件编辑完成并保存之后,GCC会读取hello.c并把它翻译成一个hello的可执行文件。
这个过程可分为四个阶段:

①.预处理阶段

预处理器(cpp)执行#开头的命令(#命令通常都是一些复制粘贴和事情),修改原C程序,得到一个新的C程序(通常是以 .i 做为文件扩展名)。

②.编译阶段

编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,其实也就是将C语言源代码转化成汇编的源代码而已。

③.汇编阶段

接下来,汇编器(as)会将hello.s翻译成机器语言指令,并把这些指令打包成可重定位目标程序,并把结果保存在二进制文件hello.o里(在符号表重定向的时候会发生很多事情,比如初始化之类的,以后再补)。其实也就是把汇编代码变成只含0和1的二进制文件。

④.链接阶段

我们的hello程序调用了printf()这个函数。而这个函数存放在一个预编译好了的printf.o的文件里。所以,链接器(ld)会帮我们将printf.o以某种形式合并到hello.o中,最后生成的就是hello可执行文件了,然后它就可以由系统加载到内存中了。
至此,编译阶段就算是大功告成了。
1729668-20190902235541902-1053103358.png

3.运行hello程序

我们在Linux系统上打开一个终端后,shell程序会执行它的代码,等待我们输入命令。
当我们键入字符串“./hello”命令之后,shell会将字符逐一读入寄存器中,并带到内存中去。
如图所示:
1729668-20190903191533933-1237604034.png
当我们敲下回车键时,shell就知道我们已经结束了命令的输入。
然后shell就会调用一系列指令来加载hello程序,这些指令会将hello程序的代码和数据从硬盘复制到内存中去。

Tips:(shell调用一系列指令来加载hello程序的过程):
3.1 shell会将CPU控制权传给Linux内核。
3.2 Linux得到控制权后会保存shell的上下文状态(即保存shell此时运行的数据和信息),然后会创建一个新的进程(即hello程序)及其上下文,并将控制权交给新进程hello程序。
3.3 hello进程终止后,Linux内核会恢复shell进程的上下文,并将控制权传回给它,然后shell就会继续欢乐的蹦跶,等待下一条命令的到来。

如图所示:
1729668-20190903193844094-1145680558.png
当hello程序的代码和数据到达内存中之后,CPU就开始执行hello程序中的代码。
这些指令会将“hello girls!”字符串复制到寄存器中去,并由寄存器带到显示设备,最终输出到屏幕。
至此,hello程序完成了他的使命,也就消亡了。
如图所示:
1729668-20190903195956716-900663649.png

转载于:https://www.cnblogs.com/shing-virus/p/11449561.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值