原创 大家的C语言-102-操作系统和可执行文件

操作系统

上节介绍了程序、内存、CPU三者之间的关系。接下来介绍一下操作系统。在最开始的时候计算机是没有操作系统的,每个使用计算机的用户都独占计算机。他们将自己写好的程序装入内容然后让CPU执行。

这样带来一个问题,计算机一次只能处理一个程序。大家都知道计算机的处理速度是很快的,但是有些程序需要在执行的过程中由使用者输入一些参数。如计算房贷还款时,程序运行后需要使用者输出贷款总额、贷款年限、利息等信息。在等待使用者输入时整个计算器都处于空闲状态。这种空闲对于计算器来说是极大的浪费,因此就会有人向能不能在一个使用者输入参数时,计算器为另个使用者提供服务。

但是如果多个人一起使用计算机会带来混乱。程序有很多那么CPU要执行哪一个?

原创 大家的C语言-102-操作系统和可执行文件

这就需要有一个管理者来控制CPU到底要执行哪个程序。而这个控制者就是操作系统。CPU提供了一个基本的硬件功能叫做中断,当等待CPU当前执行的程序等待用户输入时,CPU就会进入中断。进入中断的意思是,CPU执行内存某个固定位置的程序,而这个固定程序就是操作系统的一部分。这个固定位置的程序会告诉CPU下一个要执行的程序在内存中的位置,然后CPU就会去执行下一个程序了。道理很简单,但是操作系统还是挺复杂的,这个大家可以找一本专门介绍操作系统的书学习一下。

原创 大家的C语言-102-操作系统和可执行文件

可执行文件

由上面的描述可以看出,把程序放在内存的哪个位置是由操作系统决定的,换句话说操作系统管理着整个平台的内存。因此操作系统的另一项重要工作就是将程序加载到内存。此时硬盘登场了,硬盘可以保存数据,通常是以文件为单位保存的,如文本文件、图像文件、音乐文件等。文件除了能保存数据外还能保存程序。使用者可以将写好的程序保存为硬盘上的一个文件,然后让操作系统将写好的程序加载到内存中并控制CPU执行。有些情况操作系统还需要将程序执行的结果保存到硬盘上。比如微软写好excel软件,并安装在用户电脑的硬盘上--excel.exe的文件。用户点击excel.exe文件后,操作系统将其加载到内存中。用户操作完后用户进行保存操作,操作系统会将用户编辑后的文件保存到硬盘上。这里的excel.exe就是可执行文件。

原创 大家的C语言-102-操作系统和可执行文件

那么到底什么是可执行文件?

我们已经知道程序包含指令和数据两部分,而指令和数据都是二进制数字。那么CPU是如何知道这些数字哪部分是指令哪部分是数据呢。这分两种情况,

第一种情况是数据是指令的操作数,这部分数据叫做程序中的数据如之前2+1例子中的001指令,它的作用是将输入端的值保存到寄存器中,那么控制器就会默认001指令之前的那个数是数据而不是指令(真实的情况是,操作数在指令的后面。而例子中操作数在指令的前面)。

另一种情况是数据完全独立与程序而存在的,比如现在图形界面上显示的图片,或者启动音效等等。这些数据虽然与指令的执行无关,叫做独立数据。但也需要加载到内存后才能被程序使用。当操作系统文件将程序和独立数据加载到内存之后,会告诉CPU到程序所在的内存位置去执行。从而避免了CPU将独立数据当作程序来执行。

操作系统是如何知道在文件中哪部分是程序,哪部分是独立数据的呢?答案是操作系统对可执行文件做了一些格式上的限定,可执行文件必须按照操作系统的规定存放程序和数据。就比如家里的书柜,如果是一个有条理的人通常会将不同领域的书分开放在不同的格子中。

因此按照操作系统规定的格式存放程序和独立数据的文件就是可执行文件。Windows操作系统的可执行文件格式是PE格式,Linux操作系统的可执行文件格式就多种多样了,比较流行的是ELF格式。这也就是为什么不同操作系统之前的可执行文件不能相互执行的原因了。

了解了操作系统和可执行文件后,下一节介绍汇编语言、翻译器以及可执行文件是如何产生的。