一文教会你hello程序的执行过程

一文教会你hello程序的执行过程


以下是《深入理解计算机系统》第一章的内容:

大致是三个流程:

一、读取命令:
  初始时,:外壳程序执行它的指令,等待我们输人一个命令。当我们在键盘上输人字符串“./hello”后,外壳程序将字符逐一读人寄存器再把它存放到存储器中,如下所示。(顺序是键盘——寄存器——主存储器)

img


二、复制数据

  当我们在键盘上敲回车键时,外壳程序就知道我们已经结束了命令的输人。然后外壳执行一系列指令来加载可执行的hello文件,将hello目标文件中的代码和数据从磁盘复制到主存。 数据包括最终会被输出的字符串"hello,world\n”。(顺序的:磁盘——主存储器)。

注意:利用直接存储器存取(DMA)的技术,数据可以不通过处理器而直接从磁盘到达主存(如下图)

img


三、执行并显示
  处理器就开始执行hello程序的main程序中的机器语言指令。这些指令将"hello,world\n”字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。

img

以上图片来源于什么是「电源」程序员?


我们的指令经过了从磁盘读取到主存,再从主存读取到处理器执行的过程
而数据则是从磁盘读取到主存,再从主存读取到寄存器文件,再从寄存器文件到显示器上。


大家读完之后是不是有点感觉了,可又觉得哪里不对劲,我就是这样,所以我总结了以下几个难饶的点:


1、外壳程序是怎么样将字符逐一读人寄存器再把它存放到存储器中这些不是cpu做的吗?

2、外壳是怎样执行了一系列指令来加载可执行的hello文件的?

答:前两个问题可以一起回答,首先外壳加载和运行hello程序,并没有直接访问键盘、显示器、磁盘或者主存,而是依靠操作系统提供的服务来完成。
  什么服务呢?答案就是进程,进程是操作系统对一个正在运行的程序的一种抽象,我们运行的外壳也是一个进程,执行进程的就是CPU,结果就是将字符逐一读人寄存器,再把它存放到存储器中。
  执行hello文件的也是外壳进程吗?答案是否。每次用户通过向外壳输入一个可执行目标文件的名字,并运行一个程序时,外壳通过系统调用,将控制权传递给操作系统。操作系统保存外壳进程的上下文后,就会创建一个新进程,我们可以称之为“hello进程”,操作系统又将控制权传递给“hello进程”,处理器执行“hello进程”后,又把控制权交还给外壳进程,外壳进程继续等待下一个命令行输入。

3、外壳是怎么样将"hello,world\n”显示到屏幕上的?

答:执行完“hello进程”后,shell将运行结果通反馈给用户,也就是显示在屏幕上。


总结:shell解释命令的时候并不是亲自去执行,而是派生子进程让子进程去完成这项工作 。


哪里写得不好或者想讨论的小伙伴欢迎留言哦!

你可能感兴趣的:(shell,多进程,linux,操作系统)