软件如何控制硬件、编译器和操作系统是否需要编译
注:相信很多人都会有跟我一样的疑问,那就是软件如何控制硬件、编译器和操作系统是
否需要编译?为了解决这个问题,想了几天几夜,搞得头晕脑胀,翻了很多书,什么模拟电路,数字电路,操作系统原理,计算机组成原理,编译原理,微控制器与接口技术,也上网查看了资料,总算是稍微有点收获,以下内容有些是网上信息的整理,有些是书籍上整理出的,还有一些是我自己的理解,不保证完全正确,仅供交流学习,望有高手批评指正。
现在就让我们来讨论上述疑问
首先必须明确一下几点:
-
计算机中的任何数据(程序、数据等)都是以二进制的形式存在的于存储单元中,存储单元中实际上保存的就是高低电平。
-
在设计硬件时,就规定了一套计算机能实现的各种基本操作,我们把每一种基本操作用命令的形式来表示,就是所谓的指令,也就是每一套计算机都有自己的一套指令系统。指令通常分成操作码和操作数两大部分。而操作码就是一系列二进制编码,这些二进制编码就是控制计算机工作的电平信号。程序的执行过程就是取出指令和执行指令这两个过程的循环。机器从停机状态进入运行状态,要把第一条指令所在的地址赋给程序计数器PC,然后就进入取指阶段(这一点是至关重要的一步,后续的所有操作都是从这一步有序的开始的,计算机开机运行时最先运行的就是BIOS程序,由此可知程序计数器的初始值就是BIOS程序所在的存储单元的首地址,BIOS程序使用特殊工艺烧录到ROM中去的,在主板上有专门的BIOS芯片),在取指阶段从内存中读出的内容必为操作码,所以通过数据总线将其送至数据寄存器DR然后再送至指令寄存器IR,然后再送给指令译码器ID,译码以后就产生相应的控制信号,控制计算机各部件完成相应的任务。
-
必须明确任何可执行的代码都是机器码组成的。用任何编程语言编写的程序最终都需要编译链接成机器码程序,加载到内存中去执行代码只能是机器码。二进制代码在机器里面其实使用电压的高低来表示的电压高代表1电压低代表0。
总之一句话,计算机里面运行的是高低电压,你所有的操作,还有计算机操作系统及应用软件的操作都是通过电压的高低来对硬件进行控制的。软件的实质就是电压信号。
然后再探讨下面的问题:
1、编译程序本身也是程序,那它又是由谁来编译呢?
其实最原始的编译器是用机器码编写的,然后通过人工的方式输入到计算机中去执行的。有了这第一个编译器后,使用高级语言编写的程序就成为可能,都是按一定的规则编写的,编译的作用就是将这个按一定规则编写的程序翻译成机器码程序。这个翻译过程从电路原理上讲就是编译器程序相当于操作码,而源程序就相当于操作数,编译器代码控制硬件按照一定的算法去完成对源程序代码进行处理,操作结果就是目标代码。
有了第一个编译器后那么以后就可以用高级语言去编写新的编译器或操作系统或是任何其他的程序。这其中就用到交叉编译的概念。
2、什么是交叉编译?
一个经常会被问到的问题就是,“既然我们已经有了主机编译器,那为什么还要交叉编译呢?”其实答案很简单,没办法啊!有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
另一个经常会被问到的问题就是:“既然可以交叉编译,那还要主机编译干吗?”其实答案也很简单,交叉编译是不得已而为之!与主机编译相比,交叉编译受的限制更多,虽然在理论上我们可以做任何形式的交叉编译,但事实上,由于受到专利、版权、技术的限制,并不总是能够进行交叉编译,尤其是在业余条件下!举例来说,我们至今无法生成惠普公司专有的som格式的可执行文件,因此我们根本无法做目的平台为HPPA-HPUX的交叉编译。
需要交叉编译的原因有两个:首先,在项目的起始阶段,目的平台尚未建立,因此需要做交叉编译,以生成我们所需要的bootloader(启动引导代码)以及操作系统核心;其次,当目的平台能启动之后,由于目的平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译。
3、操作系统是如何完成对硬件的管理?
其实操作系统是通过管理各个设备的驱动程序来完成对硬件的管理,(什么是“驱动程序”呢?驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia显卡芯片公司平均每个月会升级显卡驱动程序2-3次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。)硬件能工作,但我们无法直接使用,所以有相关的设备驱动程序(他会告诉上层我这些硬件具备什么功能)提供了一个借口供上层调用。而操作系统的内核就会把这些借口进一步的封装成库函数之类的,我们上层的应用程序就可以通过调用这些库函数来间接的操作硬件了。
操作系统就是起到一个传递者和管家的角色,操作系统维护了一个叫注册表的东西,所有的硬件都得到操作系统那注册报到,那么其他的应用程序要用到硬件资源就都必须经过操作系统,由操作系统将运用程序的请求转给硬件,因为只有操作系统保存着硬件的相关信息。同样,硬件反馈回来的信息也是传给系统的,系统再转给应用程序。
4、操作系统也是软件,那它需不需要编译?
操作系统也是需要经过编译成机器码才能工作的,我们安装在硬盘上的操作系统其实就已经是机器码程序了,那它又是在哪编译的呢,其实操作系统的编译过程就是用到了上面说到的交叉编译来完成的,即在系统安装盘里的操作系统就是在别的平台上编译后的机器码。
5、操作系统是如何开始工作的?
要说明操作系统是如何工作的就必须先说说什么是BIOS。
BIOS是英文"BasicInput OutputSystem"的缩略语,直译过来后中文名称就是"基本输入输出系统"。它的全称应该是ROM-BIOS,意思是只读存储器基本输入输出系统。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机上电自检程序和系统启动自举程序。
从功能上看,BIOS主要作用如下:
⑴自检及初始化
这部分负责启动电脑,具体有三个部分:
第一个部分:是用于电脑刚接通电源时对硬件部分的检测,也叫做加电自检(PowerOn SelfTest,简称POST),功能是检查电脑是否良好,通常完整的POST自检将包括对CPU,640K基本内存,1M以上的扩展内存,ROM,主板,CMOS存储器,串并口,显示卡,软硬盘子系统及键盘进行测试,一旦在自检中发现问题,系统将给出提示信息或鸣笛警告。自检中如发现有错误,将按两种情况处理:对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提示或信号;对于非严重故障则给出提示或声音报警信号,等待用户处理。
第二个部分是初始化:包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测等,其中很重要的一部分是BIOS设置,在BIOSROM芯片中装有一个程序称为“系统设置程序”,就是用来设置CMOSRAM中的参数的,微机部件配置情况是放在一块可读写的CMOSRAM芯片中的,它保存着系统CPU、软硬盘驱动器、显示器、键盘等部件的信息,当电脑启动时会读取这些参数,并和实际硬件设置进行比较,如果不符合,会影响系统的启动。
第三个部分是引导程序:功能是引导DOS或其他操作系统。在完成POST自检后,ROMBIOS将按照系统CMOS设置中的启动顺序搜寻软硬盘驱动器及CDROM、网络服务器等有效的启动驱动器,读入操作系统引导记录,然后将系统控制权交给引导记录,由引导记录完成系统的启动。BIOS先从软盘或硬盘的开始扇区读取引导记录,如果没有找到,则会在显示器上显示没有引导设备,如果找到引导记录会把电脑的控制权转给引导记录,由引导记录把操作系统装入电脑,在电脑启动成功后,BIOS的这部分任务就完成了。
⑵程序服务处理
程序服务处理程序主要是为应用程序和操作系统服务,这些服务主要与输入输出设备有关,例如读磁盘、文件输出到打印机等。为了完成这些操作,BIOS必须直接与计算机的I/O设备打交道,它通过端口发出命令,向各种外部设备传送数据以及从它们那儿接收数据,使程序能够脱离具体的硬件操作。
⑶硬件中断处理
硬件中断处理则分别处理PC机硬件的需求,BIOS的服务功能是通过调用中断服务程序来实现的,BIOS中断服务程序,它是微机系统软、硬件之间的一个可编程接口,用于程序软件功能与微机硬件实现的衍接。DOS/Windows操作系统对软、硬盘、光驱与键盘、显示器等外围设备的管理即建立在系统BIOS的基础上。程序员也可以通过对INT5、INT13等中断的访问直接调用BIOS中断例程。这些服务分为很多组,每组有一个专门的中断。例如视频服务,中断号为10H;屏幕打印,中断号为05H;磁盘及串行口服务,中断14H等。每一组又根据具体功能细分为不同的服务号。应用程序需要使用哪些外设、进行什么操作只需要在程序中用相应的指令说明即可,无需直接控制。