1.7.2 可执行文件在硬件上的执行

1.7.2 可执行文件在硬件上的执行

编译后生成的可执行文件存储在计算机的磁盘上,在操作系统提供的用户操作的环境中,可以采用双击该文件或在命令行中输入可执行文件的名字等多种方式启动执行。

例如,对于Sub.exe文件,在Windows操作系统环境下,在DOS命令行中输入文件的名字来启动执行。假设文件存储在D 盘下:

图1.26是简化的Intel Pentium 机器的硬件模型,以此来说明硬件的执行过程。当用户在键盘上敲击字母序列“Sub”后,字符串“Sub”中的每一个字符都通过键盘设备翻译成对应的二进制代码,每一个编码被I/O 总线传递到I/O 桥,并经过I/O 桥转换传递到内部系统总线上,每个字符编码便逐一暂存在CPU 的寄存器中,当用户输入按Enter键时,操作系统Shell命令解释器就会调出内核中相应的服务例程来加载磁盘上的可执行文件Sub到主存中。于是,Sub的二进制代码便放入了主存中,同时将可执行文件Sub的第一条指令的地址送到程序计数器(Program Counter,PC),这就是CPU 下一条即将执行的指令的地址。因此,处理器随后开始根据PC存储的地址,从主存中逐条取出可执行文件Sub指令序列,然后通过存储器总线,经IO 桥转换,并经过系统总线送入CPU 中分析、解释、执行。最后由运算器(图1.27中的ALU 为算术逻辑运算部件,是运算器的核心部件)运算得到运算结果,然后存放在CPU 的内部寄存器中,最后将结果通过系统总线、IO 桥、IO 总线送入图形适配器的显存中,显示器从显存中读取显示数据并把结果显示给用户。

图1.27 Intel Pentium 机器的硬件模型

从上述的分析可知,操作系统在程序的执行过程中起到非常重要的作用。第一,操作系统的Shell命令解释器能够接受用户的操作,提供了一个可以启动程序的环境,根据用户提出的请求调出操作系统内核来加载用户程序;第二,将可执行文件从磁盘加载到主存并保证CPU 从可执行文件的第一条指令开始执行。该操作也是操作系统来提供的;第三,显示输出结果时,程序员只需要通过C 语言的库函数Printf即可实现结果在屏幕上的显示,但实际显示器等底层硬件是不能由用户程序直接访问的,也是由操作系统内核服务例程来实现的。总之,操作系统不但能够提供一个良好的人机交互界面,也可以帮助用户实现对硬件资源、文件系统、应用程序、内存分配、处理机调度等各种复杂任务的管理和配置,让用户以最简单方便的形式来使用计算机系统。