参考:《鸟叔的Linux私房菜》 0.4 软件程序运行 | 鸟哥的 Linux 私房菜:基础学习篇 第四版 (gitbooks.io)https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/6.html
一、为什么有操作系统?
为了要解决硬件方面老是需要重复编写句柄的问题,所以就有操作系统的出现了。
计算机硬件的种类繁多,每种硬件设备都有自己的操作方法。直接操作硬件需要编写特定的代码来控制硬件设备,比如读取磁盘数据、控制输入输出设备等。这种直接操作硬件的方式非常繁琐且容易出错,而且每次编写类似的程序时都需要重新编写相似的代码,导致代码重复。
在编程中,句柄通常指的是指向特定对象的标识符。在硬件操作中,句柄可以理解为指向硬件设备的标识符,用于控制硬件设备的操作。每次直接操作硬件时,都需要编写类似的代码来获取句柄并控制设备。
操作系统作为一种系统软件,它的核心目标之一就是管理和协调计算机硬件与软件资源。为了解决上述硬件操作中的重复性和标准化问题,操作系统提供了一组统一的接口和抽象层,使得开发者不需要直接操作硬件,而是通过操作系统提供的接口来间接控制硬件。这样一来,开发者就不需要为每个硬件设备编写重复的代码,而是可以利用操作系统提供的标准化接口来操作硬件。
假设你需要编写一个程序来控制磁盘读写操作,如果不使用操作系统,你可能需要为每一种磁盘类型编写专门的代码来控制它们。这不仅工作量大,而且难以维护。但是有了操作系统之后,你只需要调用操作系统提供的文件系统接口(如打开文件、读取文件、写入文件等),操作系统会自动为你处理底层的硬件操作,而无需关心具体的硬件细节。
简单来说, 操作系统就是管理硬件设备的软件,为用户提供交互界面。
二、什么是操作系统?
在早期想要让电脑执行程序就得要参考一堆硬件功能函数,并且学习机器语言才能编写程序。同时每次写程序时都必须要重新改写,因为硬件与软件功能不见得都一致。那如果我能够将所有硬件都驱动,并且提供一个软件的参考接口来给工程师开发软件的话,那开发软件不就变得非常简单了吗?这就是操作系统。
2.1 操作系统内核(Kernel)
操作系统(Operating System, OS)其实也是一组程序, 这组程序的重点在于管理电脑的所有活动以及驱动系统中的所有硬件。 我们刚刚谈到电脑没有软件只是一堆废铁,那么操作系统的功能就是让CPU可以开始判断逻辑与运算数值、 让内存可以开始载入/读出数据与程序码、让硬盘可以开始被存取、让网卡可以开始传输数据、 让所有周边可以开始运行等等。总之,硬件的所有动作都必须要通过这个操作系统来达成就是了。
上述的功能就是操作系统的核心(Kernel)了!你的电脑能不能做到某些事情,都与核心有关! 只有核心有提供的功能,你的电脑系统才能帮你完成!举例来说,你的核心并不支持TCP/IP的网络协定, 那么无论你购买了什么样的网卡,这个核心都无法提供网络能力的!
但是单有核心我们使用者也不知道能作啥事的~因为核心主要在管控硬件与提供相关的能力(例如存取硬盘、网络功能、CPU资源取得等), 这些管理的动作是非常的重要的,如果使用者能够直接使用到核心的话,万一使用者不小心将核心程序停止或破坏, 将会导致整个系统的崩溃!因此核心程序所放置到内存当中的区块是受保护的! 并且开机后就一直常驻在内存当中。
所以整部系统只有核心的话,我们就只能看着已经准备好运行(Ready)的电脑系统,但无法操作他! 好像有点望梅止渴的那种感觉啦!这个时候就需要软件的帮忙了!
2.2 系统调用(System Call)
既然我的硬件都是由核心管理,那么如果我想要开发软件的话,自然就得要去参考这个核心的相关功能! 唔!如此一来不是从原本的参考硬件函数变成参考核心功能,还是很麻烦啊!有没有更简单的方法啊!
为了解决这个问题,操作系统通常会提供一整组的开发接口给工程师来开发软件! 工程师只要遵守该开发接口那就很容易开发软件了!举例来说,我们学习C程序语言只要参考C程序语言的函数即可, 不需要再去考虑其他核心的相关功能,因为核心的系统调用接口会主动的将C程序语言的相关语法转成核心可以了解的任务函数, 那核心自然就能够顺利运行该程序了!
如果我们将整个电脑系统的相关软/硬件绘制成图的话,他的关系有点像这样:
Linux系统关系图:
电脑系统主要由硬件构成,然后核心程序主要在管理硬件,提供合理的电脑系统资源分配(包括CPU资源、内存使用资源等等), 因此只要硬件不同(如x86架构与RISC架构的CPU),核心就得要进行修改才行。 而由于核心只会进行电脑系统的资源分配,所以在上头还需要有应用程序的提供,使用者才能够操作系统的。
为了保护核心,并且让程序设计师比较容易开发软件,因此操作系统除了核心程序之外,通常还会提供一整组开发接口, 那就是系统调用层。软件开发工程师只要遵循公认的系统调用参数来开发软件,该软件就能够在该核心上头运行。 所以你可以发现,软件与核心有比较大的关系,与硬件关系则不大!硬件也与核心有比较大的关系! 至于与使用者有关的,那就是应用程序啦!
在定义上,只要能够让计算机硬件正确无误的运行,那就算是操作系统了。所以说, 操作系统其实就是核心与其提供的接口工具,不过就如同上面讲的,因为最普通的核心缺乏了与使用者沟通的友好接口, 所以在目前,一般我们提到的“操作系统”都会包含核心与相关的使用者应用软件。
简单的说,上面的图示可以带给我们下面的概念:
-
操作系统的核心层直接参考硬件规格写成, 所以同一个操作系统程序不能够在不一样的硬件架构下运行。举例来说,个人电脑版的Windows 8.1 不能直接在 ARM 架构 (手机与平板硬件) 的电脑下运行。
-
操作系统只是在管理整个硬件资源,包括CPU、内存、输入输出设备及文件系统文件。 如果没有其他的应用程序辅助,操作系统只能让电脑主机准备妥当(Ready)而已!并无法运行其他功能。 所以你现在知道为何Windows上面要达成网页影像的运行还需要类似PhotoImpact或Photoshop之类的软件安装了吧?
-
应用程序的开发都是参考操作系统提供的开发接口, 所以该应用程序只能在该操作系统上面运行而已,不可以在其他操作系统上面运行的。 现在您知道为何去购买线上游戏的光盘时,光盘上面会明明白白的写着该软件适合用于哪一种操作系统上了吧? 也该知道某些游戏为何不能够在Linux上面安装了吧?
2.3 内核功能
既然核心主要是在负责整个电脑系统相关的资源分配与管理,那我们知道其实整部电脑系统最重要的就是CPU与内存, 因此,核心至少也要有这些功能的:
-
系统调用接口(System call interface) 刚刚谈过了,这是为了方便程序开发者可以轻易的通过与核心的沟通,将硬件的资源进一步的利用, 于是需要有这个简易的接口来方便程序开发者。
-
进程管理(Process control) 总有听过所谓的“多任务环境”吧?一部电脑可能同时间有很多的工作跑到CPU等待运算处理, 核心这个时候必须要能够控制这些工作,让CPU的资源作有效的分配才行!另外, 良好的CPU调度机制(就是CPU先运行那个工作的排列顺序)将会有效的加快整体系统性能呢!
-
内存管理(Memory management) 控制整个系统的内存管理,这个内存控制是非常重要的,因为系统所有的程序码与数据都必须要先存放在内存当中。 通常核心会提供虚拟内存的功能,当内存不足时可以提供内存交换(swap)的功能哩。
-
文件系统管理(Filesystem management) 文件系统的管理,例如数据的输入输出(I/O)等等的工作啦!还有不同文件格式的支持啦等等, 如果你的核心不认识某个文件系统,那么您将无法使用该文件格式的文件啰!例如:Windows 98就不认识NTFS文件格式的硬盘;
-
设备的驱动(Device drivers) 就如同上面提到的,硬件的管理是核心的主要工作之一,当然啰,设备的驱动程序就是核心需要做的事情啦! 好在目前都有所谓的“可载入模块”功能,可以将驱动程序编辑成模块,就不需要重新的编译核心啦! 这个也会在后续的第十九章当中提到的!
事实上,驱动程序的提供应该是硬件厂商的事情!硬件厂商要推出硬件时,应该要自行参考操作系统的驱动程序开发接口, 开发完毕后将该驱动程序连同硬件一同贩卖给使用者才对!举例来说,当你购买显卡时, 显卡包装盒都会附上一片光盘,让你可以在进入Windows之后进行驱动程序的安装啊!
2.4 操作系统与驱动程序
老实说,驱动程序可以说是操作系统里面相当重要的一环了!不过,硬件可是持续在进步当中的! 包括主板、显卡、硬盘等等。那么比较晚推出的较新的硬件,例如显卡,我们的操作系统当然就不认识啰! 那操作系统该如何驱动这块新的显卡?为了克服这个问题,操作系统通常会提供一个开发接口给硬件开发商, 让他们可以根据这个接口设计可以驱动他们硬件的“驱动程序”,如此一来,只要使用者安装驱动程序后, 自然就可以在他们的操作系统上面驱动这块显卡了。
由上图我们可以得到几个小重点:
- 操作系统必须要能够驱动硬件,如此应用程序才能够使用该硬件功能;
- 一般来说,操作系统会提供开发接口,让开发商制作他们的驱动程序;
- 要使用新硬件功能,必须要安装厂商提供的驱动程序才行;
- 驱动程序是由厂商提供的,与操作系统开发者无关。
所以,如果你想要在某个操作系统上面安装一张新的显卡,那么请要求该硬件厂商提供适当的驱动程序吧! ^_^! 为什么要强调“适当的驱动程序”呢? 因为驱动程序仍然是依据操作系统而开发的, 所以,给Windows用的驱动程序当然不能使用于Linux的环境下了。