读书《计算机组成原理》,《鸟哥的Linux私房菜 基础篇》百度百科,内容摘自《计算机组成原理》,《鸟哥的Linux私房菜 基础篇》
计算机系统
在前面几天我已经对计算机的硬件做了简单介绍,但是只有硬件的计算机只是一堆废铁,不能帮助我们做任何的工作,要让计算机变得能够符合我们的心意是离不开软件的支持的,硬件是计算机的骨肉,那么软件就是灵魂了。一个完整的计算机系统包含硬件系统和软件系统两大部分。硬件通常是指一切看得见,摸得着的设备实体;而软件通常泛指各类程序和文件,它们实际上是由一些算法以及其在计算机中的表示所构成的。
1.相辅相成的软硬件关系
软件是计算机的物质基础,正是在高速发展的硬件基础上,才有软件赖以生存的空间和活动场所,没有硬件对软件的支持,软件的功能就无从谈起;同样,软件是计算机系统的灵魂,没有软件的硬件“裸机”将不能给用户任何帮助,犹如一堆废铁。因此,硬件和软件是相辅相成、不可分割的整体。
当前,计算机的硬件和软件正朝着互相渗透、互相融合的方向发展,在计算机系统中并没有一条明确的软硬件分界线。原来一些硬件实现的功能可以改由软件模拟来实现,这种做法称为硬件软化,它可以增强系统的功能和适应性;同样,原来由软件实现的功能也可以改由硬件来实现,称为软件硬化,它可以显著降低软件在时间上的开销。由此可见,硬件和软件之间的界限是模糊而浮动的,对于程序设计人员来说,如软件和硬件在逻辑上是等价的。一项功能究竟采用何种方式实现,应该从系统的效率、速度、价格和资源状况诸方面综合考虑。
除去硬件和软件,计算机中还有一个常见的概念,固件(Firmware),固件是1967年由美国人A.Opler首先提出的。固件是指那些存储在能永久保存信息的器件(如ROM)中的程序,是具有软件功能的硬件。固件的性能指标介于硬件和软件之间,吸收了软硬件各自的优点,其执行速度快于软件,灵活性优于硬件,是软、硬件结合的产物,计算机功能的固件化将成为计算机发展的一个趋势。
2.计算机软件
一般来说,目前的计算机系统将软件分为两大类,一个是系统软件(OS),一个是应用程序,我们在了解OS之前先来了解一下什么是程序,尤其是机器程序。
2.1 机器程序与编译程序
我们知道计算机只认识0和1(关于0和1,我们放在后面的数据表示中讲解),而且计算机最重要的运算与逻辑判断是在CPU内部,而CPU其实是具有微指令集的。因此,我们需要CPU帮忙工作时,就得要参考微指令集的内容,然后撰写让CPU读的懂的脚本给CPU执行,这样才能让CPU运作。
不过这样的流程有几个很麻烦的地方,包括:
- 需要了解机器语言:机器只认识0和1,因此你必须要学习直接写给计算机看的语言,这是相当困难的。
- 需要了解硬件的相关功能函数:因为你的程序必须要写给机器看,当然你就得要参考机器本身的功能,然后针对该功能去撰写程序代码。例如,你要让DVD影片能够播放,那就得要参考DVD光驱的硬件信息才行。万一你的系统有比较冷门的硬件,光是参考技术手册可能就会累死。
- 程序不具有可移植性:每个CPU都有独特的微指令集,同样的,每个硬件都有其功能函数。因此,你为A计算机写的程序,理论上是没有办法在B计算机上面运作的。而且程序代码的修改也是非常困难的,因为是机器码,并不是人类看得懂的程序语言。
- 程序具有专一性:因为这样的程序必须要针对硬件功能函数来编写,如果已经开发了一支浏览器程序,想要再开发档案管理程序时,还得从头再参考硬件的功能函数来继续编写,每天都在和硬件奋战。
从上面的图示我们可以看到高阶程序语言与程序代码是很容易查看的。问题是,在这样的环境底下我们还是得要考虑整体的硬件系统来设计程序。
举例来说,当你需要将运作的数据写入内存中,你就得要自行分配一个内存区块出来让自己的数据能够填上去,所以你还得要了解内存地址是如何定位的,想到这里就不禁觉得程序员知道的好多啊。
为了克服硬件方面老是需要重复撰写内存地址句柄的问题,所及就有了操作系统(Operating System,OS)的出现。下面我们就来认识一下OS。
2.2 操作系统OS与应用程序
如同前面提到的,在早期想要让计算机执行程序就得要参考一堆硬件功能参数,并且学习机器语言才能撰写程序。同时每次写程序时都必须要重新改写,因为硬件与软件功能不见得都一致之故。那如果我能够将所有的硬件都驱动,并且提供一个发展软件的参考接口来给工程师开发软件的话,那发展软件不就变得非常简单了?这就是操作系统的主要职责了。
2.2.1 操作系统的核心
OS其实就是一组程序,这组程序的重点在于管理计算机的所有活动以及驱动系统中的所有硬件。我们刚刚谈到计算机如果没有软件只是一堆废铁,那么操作系统的功能就是让CPU可以开始判断逻辑与运算数值、让主存储器可以开始加载/读出数据与程序代码、让硬盘可以开始被存取、让网卡可以开始传输数据、让所有周边可以开始运转等等。总之,硬件的所有动作都必须要透过这个操作系统来达成就是了。
上述的功能就是操作系统的核心(Kernel)了,你的计算机能不能做到某些事情,都与核心有关。只要核心有提供的功能,你的计算机系统就能帮你完成。举例来说,你的核心并不支持TCP/IP的网络协议,那么无论你购买什么样的网卡,这个核心都无法提供网络能力。
但是单有核心我们使用者也不知道能做什么,因为核心主要在管控硬件与提供相关的能力(例如网络功能),这些管理的动作是非常的重要的,如果使用者能够直接使用到核心的话,万一用户不小心将核心程序停止或破坏,将会导致整个系统的崩溃。因此核心程序所放置到内存当中的区块是受保护的。并且开机后就一直常驻在内存当中。所以整部系统只有核心的话,那么我们就能看着一个已经准备好运作的计算机系统,但是我们无法运行他。这个时候就需要软件的帮忙了。
2.2.2 系统呼叫(System Call)
既然计算机的硬件都是由OS核心管理,那么如果我想要开发软件的话,自然就得要去参考这个核心的相关功能了。如此一来不是从原来的参考硬件函数变成参考OS Kernel,还是很麻烦的,那么有没有更简单的方法呢?
为了解决这个问题,OS通常会提供一整组的开发接口给工程师开开发软件。工程师只要遵守该开发接口那就很容易开发软件了。举例来说,我们学习C程序语言只要参考C程序语言的函数即可,不需要再去考虑其他核心的相关功能,因为核心的系统呼叫接口会主动将C程序语言的相关语法转为核心可以了解的任务函数,那核心自然就能够顺利运作该程序了。
如果我们将整个计算机系统的相关软件/硬件绘制成图的话,他们的关系如下:
计算机系统主要由硬件构成,然后核心程序主要在管理硬件,提供合理的计算机系统资源分配(包括CPU资源、内存使用资源等等),因此只要硬件不同(如x86架构与RISC架构的CPU),核心就得要进行修改才行。而由于核心只会进行计算机系统的资源分配,所以在上头还需要有应用程序的提供,用户才能够操作系统的。
为了保护核心,并且让程序设计师比较容易开发软件,因此操作系统除了核心程序之外,通常还会提供一整组开发接口,那就是系统呼叫层。软件开发工程师只要遵循公认的系统呼叫参数来开发软件,该软件就能够在该核心上头运作。所以你可以发现,软件与核心有比较大的关系,与硬件关系则不大。硬件也与核心有比较大的关系,至于与用户有关的,那就是应用程序啦。
在定义上,只要能够让计算机硬件正确无误的运作,那就算是操作系统了。所以说,操作系统其实就是核心与其提供的接口工具,不过就如同上面讲的,因为内核缺乏了与用户沟通的亲和接口,因此在目前,一般我们提到的操作系统都会包含核心与相关的用户应用软件。
简单的说,上面的图示可以带给我们底下的概念:
- 操作系统的核心层直接参考硬件规格写成,所以同一个操作系统程序不能够在不一样的硬件架构下运作。这个硬件不仅指的是CPU,包括声卡,内存等计算机的构成。
- 操作系统只是在管理整个硬件资源,包括CPU、内存、IO装置及文件系统文件。如果没有其他的应用程序辅助,操作系统只能让计算机准备妥当罢了。并无法运作其他功能,所以我们想要操作计算机还要安装其他应用软件。
- 应用程序的开发都是参考操作系统提供的开发接口,所以该应用程序只能在该操作系统上面运作而已,不可以在其他操作系统上面运作。我们发现有时候安装软件会提示该软件只能安装在什么什么系统上,其实就是这个道理。
2.2.3 核心功能
既然核心主要是在负责整个计算机系统相关的资源与管理,那么我们知道其实整部计算机系统最重要的就是CPU与主存储器,因此,核心至少也要有这些功能:
- 系统呼叫接口(System Call Interface),上面说过,这是为了方便程序开发者可以轻易的透过与核心的沟通,将硬件的资源进一步的利用,于是需要有这个简易的接口来方便程序开发者。
- 程序管理(Process control)我们在工作过程中总会听说多任务环境,一部计算机可能同时间有很多的工作跑到CPU等待运算处理,核心这个时候就必须能够控制这些工作,让CPU的资源作有效的分配才行!另外。良好的CPU排程机制(就是CPU先运作哪个工作的排列顺序)将会有效的加快整体系统的效能。
- 内存管理(Memory management)控制整个系统的内存管理,这个内存控制是非常重要的,因为系统所有的程序代码与数据必须要先存放在内存中。通常核心会提供虚拟内存功能,当内存不足时可以提供内存置换(swap)的功能。
- 文件系统管理(Filesystem management)文件系统的管理,例如数据的输入输出等等的工作了,还有不同文件格式的支持等等,如果你的核心不认识某个文件系统,那么您将无法使用该文件格式的档案。
- 装置的驱动(Device drivers)就如同上面提到的,硬件的管理是核心的主要工作之一,当然了,装置的驱动程序就是核心所需要做的事情了,好在目前都有所谓的可加载模块功能,可以将驱动程序编辑成模块,就不需要重新的编译核心了。
事实上,驱动程序的提供是硬件厂商的事情,硬件厂商要推出新硬件时,应该要参考OS的驱动程序接口,开发完毕后将驱动程序连同硬件一同销售,并且现实也是这样的。
2.2.4 操作系统与驱动程序
老实说,驱动程序可以说是操作系统里面相当重要的一环了。不过,硬件可是持续在进步当中的,包括主板、显示适配器、硬盘等等。那么比较晚推出的较新的硬件,我们的OS当然是不认识的,那OS该如何驱动这些新的硬件呢,为了克服这个问题,OS通常会提供一个开发接口给硬件开发商,让他们可以根据这个接口设计可以驱动他们硬件的驱动程序,如此一来,只要使用者安装驱动程序后,自然就可以在他们的OS上面驱动这些硬件了。
由上图我们可以得到几个小重点:
- 操作系统必须要能够驱动硬件,如此应用程序才能够使用该硬件功能;
- 一般来说,OS会提供开发接口,让开发商制作他们的驱动程序;
- 要是用新硬件功能,必须要安装厂商提供的驱动程序才行;
- 驱动程序是由厂商提供的,与OS开发者无关。
所以,如果你想要更换硬件的话,那么就要求该供应商提供该硬件专用的驱动吧,注意不同的硬件对应不同的驱动。
2.3 应用程序
应用程序是参考OS提供的开发接口所开发出来的软件,这些软件可以让用户操作,以达到某些计算机的功能利用。举例来说,办公室软件office主要就是用来让使用者办公使用的;图像处理软件就是用来处理影音资料的。
需要注意的是,应用程序是与OS有关系的,如同上面的图示当中的说明。因此,如果你想要购买新软件,一定要参考软件说明,软件是否支持你的OS。
3. 系列机和软件兼容
小编大学时,同学们组团去外面组装台式机,小编家境一般,过了几年没有电脑的日子,好来寝室里有几台电脑,所以倒也不算陌生,从那时起,对于组装机就比较感兴趣了,参加工作后,买的第一台电脑是ThinkPad E420,这算是一个地地道道的系列机了,这也是本节我想说的了---系列机。
计算机发展到了今天,我们已经很少再去组装机器了,一是电子产品价格逐渐亲民,第二也是真正了解硬件的人不多的缘故了。我们选购计算机基本上还是以系列机为准。系列机是指一个厂家生产的,具有相同的系统结构,但具有不同组成和实现的系列不同型号的机器。
系列机从程序设计者的角度看具有相同的机器属性,即相同的系统结构。这里的相同指在指令系统、数据格式、字符编码、中断系统、控制方式和输入输出操作方式等多个方面保持统一,从而保证了软件的兼容。系列机的软件兼容分为向上兼容和向下兼容、向前兼容和向后兼容4种。向上(下)兼容指的是按某档次机器编制的程序,不加修改就能运行在比他更高(低)档的机器上;向前(后)兼容是指按照某个时期投入市场的某种型号机器编制的程序,不加修改就能运行在它之前(后)投入市场的机器上。
对于系列机软件兼容性向下和向前兼容可以不作要求,但必须保证向后和尽量做到向上兼容。即开发的软件必须能够运行在软件开发后新投入市场的机器上,尽量能够做到比它开发环境更高的硬件环境中的运行。
一款软件的开发周期和生命周期是很长的,我们必须要考虑到这个软件在未来很长的一段时间内能够兼容它发布之后出现的新的硬件。
4. 计算机的多层次机构
计算机系统层次结构,指的是计算机系统由硬件和软件两大部分所构成,而如果按功能再细分,可分为7层。把计算机系统按功能分为多级层次结构,就是有利于正确理解计算机系统的工作过程,明确软件,硬件在计算机系统中的地位和作用。计算机的7层结构如下图所示。
4.1 硬联逻辑级
第零级是硬联逻辑级,这是计算机的内核,由门,触发器等逻辑电路组成。
4.2 微程序级
第一级是微程序级。这级的机器语言是微指令集,程序员用微指令编写的微程序,一般是直接由硬件执行的。
4.2.1 微指令&微程序&机器指令
机器指令(Machine Instructions)是CPU能直接识别并执行的指令,它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等。
微程序(microprogram)是英国剑桥大学教授M.V.Wilkes在1951年首先提出的,它是实现程序的一种手段,具体就是将一条机器指令编写成一段微程序。每一个微程序包含若干条微指令,每一条微指令对应一条或多条微操作。在有微程序的系统中,CPU内部有一个控制存储器,用于存放各种机器指令对应的微程序段。当CPU执行机器指令时,会在控制存储器里寻找与该机器指令对应的微程序,取出相应的微指令来控制执行各个微操作,从而完成该程序语句的功能。微程序设计技术,指的是利用软件技术来实现硬件设计的一门技术。
微指令是指在微程序控制的计算机中,同时发出的控制信号所执行的一组微操作。微指令是由同时发出的控制信号的有关信息汇集起来形成的。将一条指令分成若干条微指令,按次序执行就可以实现指令的功能。若干条微指令可以构成一个微程序,而一个微程序就对应了一条机器指令。
4.3 传统机器级
第二级是传统机器级,这级的机器语言是该机的指令集,程序员用机器指令编写的程序可以由微程序进行解释。
4.4 操作系统级
第三级是操作系统级,从操作系统的基本功能来看,一方面它要直接管理传统机器中的软硬件资源,另一方面它又是传统机器的延伸。
4.5 汇编语言级
第四级是汇编语言级,这级的机器语言是汇编语言,完成汇编语言翻译的程序叫做汇编程序。
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
4.6 高级语言级
第五级是高级语言级,这级的机器语言就是各种高级语言,通常用编译程序来完成高级语言翻译的工作。如Java、C++等。这类语言通过特定的函数和工具类完成编写,然后编译,计算机运行解释(编译)后的机器码。
4.7 应用语言级
第六级是应用语言级,这一级是为了使计算机满足某种用途而专门设计的,因此这一级语言就是各种面向问题的应用语言。
把计算机系统按功能分为多级层次结构,就是有利于正确理解计算机系统的工作过程,明确软件,硬件在计算机系统中的地位和作用。
5. 实际机器和虚拟机器
实际机器是指由硬件或固件实现的机器,如上面多层次机构中的第零级到第二级。虚拟机器是指以软件或以软件为主实现的机器,对应多层次结构的第三级到第六级。
虚拟机器只对该级的观察者存在,即在某一级观察者看来,他只需要通过该级的语言来了解和使用计算机,至于下级是如何工作和实现就不必关心了。如高级语言级及应用语言级的用户,不必了解计算机的具体组成,不必熟悉指令系统,直接用所指定的语言描述所要解决的问题即可。
本人从事Java开发,所以对于虚拟机有一定的认识,Java就通过虚拟机来运行我们编写的源代码的,我们并不用关心内存是如何分配和回收的,都是由虚拟机帮助我们完成的,关于JVM我们后面再以大篇幅,多篇幅学习了解。所以我们在实际开发中并不用太过深入学习实际机器级别,而是将重心放在虚拟机级,但是了解计算机的硬件和组成利于我们以后更深层次的学习,所以是有必要了解的。
结束语
计算机系统了解到这里,已经可以了。总结起来计算机系统就是硬件系统和软件系统相辅相成组成的,这两者并没有明显的界限。而计算机软件目前主要分为OS和应用程序,其中OS提供对外接口供各驱动厂商和软件开发人员编写程序,实际我们编程就是面向OS编程的,对于硬件,我们并不用了解的一清二楚,但是硬件决定程序的功能却是不能反驳的。
我们在软件开发中要有充分的前瞻性,考虑到对于未来机器的兼容性。
计算机系统按照功能再细分,可以分为7层,其中硬联逻辑层、微程序级和传统机器级构成了实际机器,这部分内容我们要了解。操作系统级、汇编语言级、高级语言级和应用语言级构成了虚拟机器,这部分是我们应该重点,着重学习的,我们以后绝大部分的篇幅也是围绕这部分进行的。