- 计算机系统:从应用程序到底层实现
- 赵欢 杨科华编著
- 1091字
- 2025-05-07 10:52:30
1.2.2 可执行程序的执行过程
对于一个存放在磁盘上的可执行文件,可以在操作系统提供的用户操作环境中,采用双击对应图标或在命令行中输入可执行文件名等方式来启动执行。在UNIX系统中,可以通过shell命令行解释器来执行一个可执行文件。例如,对于上述可执行文件hello,通过shell命令行解释器启动执行的结果如下:

Hello World程序的运行过程
扫描上方二维码可观看知识点讲解视频

shell命令行解释器会显示提示符unix>,告知用户它准备接收用户的输入,此时,用户可以在提示符后面输入需要执行的命令名,也可以输入一个可执行文件在磁盘上的路径名,例如,上述“./hello”就是可执行文件hello的路径名,其中“./”表示当前目录。在命令后用户需按下Enter键表示结束。图1-4显示了在计算机中启动和执行hello程序的整个过程。
如图1-4所示,shell程序会将用户从键盘输入的每个字符逐一读入CPU寄存器中(对应线①),然后再将其保存到主存储器中,在主存的缓冲区形成字符串“./hello”(对应线②)。等到接收到Enter按键时,shell将调出操作系统内核中相应的服务例程,由内核来加载磁盘上的可执行文件shell到存储器(对应线③)。内核加载完可执行文件中的代码及其所要处理的数据(这里是字符串“hello,world\n”)后,将hello第一条指令的地址送到程序计数器(Program Counter,PC)中,CPU永远都会将PC的内容作为将要执行的指令的地址,因此,处理器随后开始执行hello程序,它将加载到主存的字符串“hello,world\n”中的每一个字符从主存取到CPU的寄存器中(对应线④),然后将CPU寄存器中的字符送到显示器上显示出来(对应线⑤)。

图1-4 启动和执行hello程序的整个过程
从上述过程可以看出,一个用户程序被启动执行,必须依靠操作系统的支持,包括外壳程序和内核服务例程。例如,shell命令行解释器是操作系统外壳程序,它为用户提供了一个启动程序执行的环境,对用户从键盘输入的命令进行解释,并调出操作系统内核来加载用户程序(用户输入命令对应的程序)。显然,用来加载用户程序并使其从第一条指令开始执行的操作系统内核服务例程也是必不可少的。此外,在上述过程中,涉及键盘、磁盘和显示器等外部设备的操作,这些底层硬件是不能由用户程序直接访问的,此时,也需要操作系统内核服务例程的支持,例如,用户程序需要调用内核的read系统调用服务例程读取磁盘文件或调用内核的write系统调用服务例程把字符串写到显示器中等。
从图1-4可以看出,程序的执行过程就是数据在CPU、主存储器和I/O模块之间流动的过程,所有数据的流动都是通过总线、I/O桥接器等进行的。在总线上传输数据之前,需要先将其缓存在存储部件中,因此,除了主存储器本身是存储部件以外,在CPU、I/O桥接器、设备控制器中也有存放数据的缓冲存储部件,例如,CPU中的寄存器堆、设备控制器中的数据缓冲寄存器等。