HelloWorld从编译到运行,计算机底层到底发生了什么?

本文简要描述了一个简单的HelloWorld程序,从编译到执行,计算机底层做了哪些工作。以 C 程序为例。

示例代码:

#include <stdio.h>

int main(){
    
    
  printf("hello, world\n");
  return 0;
}

使用文本编辑器编写上述代码,并保存在文本文件中,文件名为hello.c。

一、源代码以字节序列的形式存储在文件中

源文件 hello.c 是由0和1组成的位序列,8位组成1个字节,每个字节表示程序中的某个文本字符。大部分计算机系统使用ASCII码表示文本字符,也就是说用一个单字节大小的整数值唯一表示一个字符。下图将 hello.c 源文件中的内容映射成了ASCII码。源文件通过字节序列的方式存储了源代码,每个字节都有一个整数值,唯一对应一个字符。比如,第一个字节的整数值35,代表了字符"#"。

在这里插入图片描述

二、源代码编译过程

在Unix或Linux系统上,由编译器驱动程序 (如gcc) 首先读取源文件hello.c,然后进行源代码的编译工作,将其转化为目标文件。比如:

gcc -o hello hello.c

编译的流程如下图所示:

在这里插入图片描述

  • 预处理。预处理器cpp根据以字符"#"开头的命令,修改原始的C程序。本例中#include <stdio.h>,意味着要让预处理器读取系统头文件stdio.h的内容,将其直接插入程序文本的这个位置,得到 hello.i 文件。
  • 编译。编译器ccl将 hello.i 文件翻译成汇编代码,得到hello.s文件。
  • 汇编。汇编器as将 hello.s 文件翻译成机器语言指令,并把这些指令打包成可重定位目标程序,得到hello.o文件,这是一个二进制文件。
  • 链接。hello程序中调用了标准C库的printf函数,该函数被预编译在另外一个名为printf.o的目标文件中。此前,hello程序仅使用符号标识了这个函数,并未真正引入。链接器ld把printf.o文件和hello.o文件进行了合并,得到可执行的目标文件hello。此时,hello程序可以被加载到内存中,被系统执行。

三、目标程序执行过程

通常,我们会使用命令行的方式去执行目标程序。

那具体是怎么做的呢?

一般,我们会将文件名输入到名为shell的应用程序中,然后执行,比如:

扫描二维码关注公众号,回复: 11892351 查看本文章
linux> ./hello
hello, world
linux>

那shell又是什么?

shell是一个命令行解释器,它输出一个提示符>,等待输入一个命令行,然后执行这个命令。如果这个命令并非shell内置命令,则shell会假设这是一个可执行文件的名字。shell加载并运行hello程序,hello程序在屏幕上打印消息,然后终止。hello程序终止后,shell随后输出一个提示符,等待下一个输入的命令。

1、从硬件层面,看待底层执行过程:

①初始时刻,shell程序执行它的指令,等待输入一条命令。

②我们在键盘上输入字符串"./hello",shell将字符依次读入寄存器,再把它存储到内存中。

③我们在键盘上敲击回车键enter,shell了解到命令输入已结束,然后shell执行一系列指令来加载hello文件。这些指令会把hello目标文件的代码和数据从磁盘复制到内存,数据指的是那串字符串"hello, world\n"。

④此时目标文件hello的代码和数据已加载到内存中,处理器可以开始执行hello程序中main函数的机器语言指令。这些指令将字符串"hello, world\n"的字节从内存复制到寄存器中,再从寄存器复制到显示器,最终在显示器上进行显示。

2、从进程角度,看待shell进程和hello进程的并发过程:

①初始时刻,只有shell进程在运行,即等待命令行的输入。

②当我们让shell运行hello程序时,shell通过调用系统调用,将控制权传递给操作系统。

③操作系统保存shell进程的上下文 (上下文是操作系统跟踪进程运行所需的所有状态信息,比如PC和寄存器的值、主存的内容等,这样操作系统才能顺序进行进程切换) ,然后创建一个新的hello进程及其上下文,并将cpu的控制权交递给hello进程。

④当hello进程终止,操作系统根据shell进程的上下文,恢复shell进程的执行,即把cpu的控制权传递给shell进程。

操作系统内核管理进程间的切换工作,内核是系统管理全部进程所用代码和数据结构的集合。当应用程序需要操作系统的某些操作,比如读写文件,那么就需要执行系统调用,将控制权传递给内核,然后内核执行被请求的操作,并返回用户程序。

在这里插入图片描述

参考资料:《深入理解计算机系统》

猜你喜欢

转载自blog.csdn.net/Longstar_L/article/details/109048583