这一章属于理论知识介绍,让读者从宏观的角度了解什么是操作系统,一个日常生活中的操作系统会由哪几部分组成。使读者先从整体上对操作系统有个大概的认知。然后,介绍编写一个操作系统所需要的知识。最后是关于本书操作系统的简介。

我知道对于一本实践类型的书籍,应该尽快让读者动手实践。但是,没有理论作为指导思想的话,这个操作系统其实走不了多远。而且,随着记忆的淡去,对一些概念的理解也会越来越模糊。考虑到这些因素,先用当下成熟的技术,重新诠释这些模糊的概念后,再开始我们的实践之旅。

PS:由于是在创作初期,文章可能会有错误、内容遗漏、阐述的不到位或者读者想看而我没有写到的内容,希望大家多指点(留言或者发信息给我都可以)。
考虑到以上原因,希望大家能够关注或者推荐本书,让更多的人学习到,并避免错过之前内容的更新与补充

1.1 什么是操作系统

何为操作系统?其实操作系统这个概念很宽泛;不论是办公和生活使用的各类操作系统,还是机械工业生产制造使用的仪器仪表,都是含有操作系统的,哪怕只有一条指令的单片机,也可以叫做嵌入式操作系统。从这个意义上理解,可以把操作系统和硬件区分开。要么是只有硬件电路的裸机,要么是含有操作系统的硬件电路(这里的硬件电路指含有处理器的可编程电路)。

对于只有一条指令的单片机,将其称之为操作系统,未免显得这个操作系统有些太简单了,以至于给人们的感觉,不像一个操作系统。在人们眼里,操作系统应该是会有一个功能强大高效运行的核心、万能的驱动程序、绚丽的操作界面和舒适简洁的操作方式,以及方便实用的工具组成。可是在当年,操作系统只是一个连硬盘都没有;甚至是,只有一些简单的逻辑门电路组成的怪物。其实操作系统也是有发展史的。

从操作系统的发展史来看。先从单任务系统,到批处理系统,再到后来的分时操作系统、实时操作系统、嵌入式操作系统,以及现在最流行的云系统。操作系统随着时代的发展,硬件的不断更新换代。操作系统的功能会因为它的应用场景不同,而具有不同的特点。但它的根本目的依然是——为了方便人们对硬件设备的交互和使用。

PS:由于是在创作初期,文章可能会有错误、内容遗漏、阐述的不到位或者读者想看而我没有写到的内容,希望大家多指点(留言或者发信息给我都可以)。
考虑到以上原因,希望大家能够关注或者推荐本书,让更多的人学习到,并避免错过之前内容的更新与补充

1.2 操作系统结构

对于一款功能完善,方便易用的操作系统来说,它也是由一套庞大的结构组成的。

它的整体结构如下图所示:

enter image description here 图1-1

从图1-1可以很明显的看出来,操作系统分为内核层与应用层。内核层主要是由:引导启动、内存管理、异常中断处理、进程管理、设备驱动、文件系统等模块组成;而系统API库和应用程序则属于应用层的范畴。之所以将内核层和应用层分开,是因为内核层主要负责控制硬件设备,分配系统资源,保持系统的稳定性,为应用层提供健全的接口支持等;应用层主要负责人性化的人机交互操作,绚丽的表现效果等更贴近人们生活的抽象表达。下面我们将对各个模块逐一进行介绍 。

  • 引导启动

引导启动是指在电脑上电经过BIOS自检后,到跳转至内核程序执行前,这中间执行的一段或几段程序,这段程序主要用于电脑硬件的检测和一些参数的配置,然后将这些内容提交给内核,内核对这些内容进行分析,并对内核自身进行配置。图1-1中将引导启动模块与其他内核层模块用横线隔开,是考虑到引导启动模块只是为了辅助内核启动,而并非真正属于内核。当进入内核后,引导程序就不再执行了。如果把内核比作卫星的话,那么引导程序就相当于运载火箭,卫星进入轨道后,火箭就完成了它的使命。

曾经引导启动程序分为两部分——Boot和Loader。现在把这两部分功能合二为一,统称为BootLoader。

目前比较流行的引导启动程序有:Grub,Lilo,Uboot等程序。他们的功能都比较强大,可以通过终端命令行与其进行简单的交互,给我们控制内核的加载和使用提供了方便。

  • 内存管理

内存管理单元主要是为了将物理内存有效的管理起来,给其他模块提供内存(连续的或非连续的)、有效的地址变换和映射。

像Linux内存管理单元的伙伴算法,算是一种稳定成熟的内存管理算法,可以长时间保持内存的稳定分配,防止内存碎片过多。

还有内存线性地址空间的红黑树管理算法,既兼顾搜索时间损耗又兼顾插入时间损耗。这两个时间损耗的区别是:搜索时间损耗是将原有的线性搜索转换为树状搜索,这样会大大缩短搜索的时间损耗。而插入时间损耗是将新创建的节点结构插入到树状结构中,但是,红黑树的特点是节点插入树中后,会调整树的高度或者说是深度。如果调整的波及范围很广的话,势必会浪费时间。因此Linux选择红黑树这种近似平衡树来代替之前的AVL树(绝对平衡树)也是出于这方面的考虑。

  • 异常中断处理

异常处理主要是指处理器执行程序时候产生的问题,比如说:除零,段溢出,页错误,无效指令,调试错误等等。这些异常有的是可以恢复的,有的是不可以恢复的,具体要根据错误类型和程序逻辑进行相应的处理。

中断处理主要是指处理器接收到硬件设备发来的中断请求信号等待处理器进行应答,并作出相应的处理。这部分内容和外围的硬件设备关系比较密切。它的处理效率会影响整体的执行速度,所以通常中断处理会被分为中断上部和中断下部。中断上部要求快速响应中断,在取得必要的数据和信息后,立刻恢复中断现场,使处理器可以再次接收中断信号。中断下部被用来处理剩下的中断内容,像:数据解析、调整驱动程序状态等更耗时的内容。为了让更紧迫的进程优先执行,中断下部还可以将处理内容放到一个进程里去处理,这样就可以让更高优先级的进程得到快速执行。

  • 进程管理

说道进程一定会有人想问进程和程序的区别,程序是静静的躺在文件系统里的二进制代码,属于非运行状态。一旦把这个程序加载到处理器内运行就变成了进程。进程是程序的运行状态,所以它会比程序多出很多在管理层面的东西。

提到进程管理功能主要的就是进程调度策略,一个好的进程调度策略会提高程序的执行效率和反应速度。在Linux里从O1调度策略,到电梯调度策略,再到现在的CFS调度策略,逐渐的让进程执行的越来越平均,越来越快。

进程管理的另一主要部分就是进程间通信了,进程间通信有很多种,如:SIGNAL信号,管道,共享内存,信号量等等,这些通信机制各有特点,互相弥补不足。

  • 设备驱动

随着硬件设备的不断增多,花样齐全,与之对应的设备驱动程序也渐渐的占据了操作系统的很大一部分空间。为了方便驱动人员的开发和使用,不管是Linux还是Windows都为驱动程序提供了一套或者几套成熟的驱动框架供程序员使用。为了方便驱动程序的调试和即插即用的灵活性以及给内核空间减轻容量负担,渐渐的将驱动程序以模块的形式,动态的挂载到内核空间中。从而做到即插即用,这样一来,大大减小了内核空间代码的占用量。

设备驱动程序会与内存管理、中断处理、文件系统以及进程管理共同协作。为了让硬件设备给应用程序提供接口,设备驱动程序几乎调用了内核层的所有资源,这也是开发操作系统的目的——方便人们与设备交互。

  • 文件系统

文件系统是用于将机械硬盘的一部分扇区组织成一个方便管理的结构化单元。这里的扇区也可以是内存块,这样就组成了一个RAMDisk(内存式硬盘)。这样的一个内存式硬盘,与普通的机械硬盘的扇区相比,单单在读写文件的速度上,就已经不是一个数量级上了。这种内存式硬盘的缺点是掉电数据丢失,但是与它的优点相比,这个缺点是完全可以克服的,像Linux的sys文件系统,就是在RAMDisk中创建的。

文件系统的种类也是纷繁复杂的,像上面提到的sys文件系统,还有大家耳熟能详的FAT类文件系统,以及Linux的EXT类文件系统,他们对扇区的组织形式各有特色,但都是为了给原生操作系统提供方便快捷的使用而设计的。

  • 系统API 库

系统API库接口有很多标准,比如Linux遵循的POSIX标准。对于不同的接口标准,其定义和封装的函数实现是不一样的。不管怎么说,最终都是为了给应用程序提供简单快捷便于使用的接口。

  • 应用程序

应用程序包括我们自己安装的软件和系统提供的软件和服务。

在众多应用程序中,比较特殊的一个应用程序就是窗口管理器。窗口管理器用于对图形界面窗口的管理,包括:窗口的位置布局、鼠标键盘的消息投递、活动窗口仲裁等等。窗口的位置布局负责调整窗口的比例、大小、最大化、最小化、关闭窗口等一系列与窗口的显示效果有关的功能。键盘鼠标的消息投递负责将接收到的键盘鼠标消息,通过窗口管理器对活动窗口的仲裁,然后再将消息发往到活动窗口。活动窗口仲裁负责根据当前鼠标的使用情况,选择出正在使用的窗口作为活动窗口。

PS:由于是在创作初期,文章可能会有错误、内容遗漏、阐述的不到位或者读者想看而我没有写到的内容,希望大家多指点(留言或者发信息给我都可以)。
考虑到以上原因,希望大家能够关注或者推荐本书,让更多的人学习到,并避免错过之前内容的更新与补充

1.3 写操作系统需要的知识

操作系统作为与硬件设备紧密相连的软件程序,编写操作系统所需要的知识,自然而然也会涉及软件和硬件两方面。

  • 硬件方面

首先,要根据我们的硬件电路掌握其处理器及其外围硬件电路的组成。更通俗一点说,就是处理器和外围电路是怎么连接的。了解这些,应该就知道处理器如何对外围硬件设备进行控制及通信了。对于ARM这类片上系统,每个芯片和外围硬件电路的链接方法非常灵活,所以这一部分内容必须要掌握。但是,对于通用的PC平台,处理器和外围硬件电路的链接方法是基本是固定的,因此写一个PC机的操作系统在外围硬件电路的连接上,显得没有ARM片上系统平台那么重要。

其次,既然对外围电路的连接清晰后,下一步就是阅读外围硬件设备的芯片手册。外围硬件设备的芯片手册,它会详细讲解该芯片的硬件特性和通信方式,以及芯片内部的寄存器功能,还有对寄存器的控制方法。在这一点上不管是什么硬件平台,外围硬件设备的芯片手册都是同等的重要,不了解这部分内容,就无法知道如何与其进行通信。对于系统开发人员,我们更关注的是如何与外围硬件设备通信,怎么控制他们的寄存器状态。至于硬件手册里,对电路的链接和工作环境温度等硬件特性指标,属于硬件工程师关注的内容,对我们不太重要,一般情况下不必太关注。

所以,在硬件方面掌握处理器和外围硬件设备的芯片手册以及外围电路的链接,这样在硬件方面基本就可以应付了。处理器手册对控制系统运行,带来了良好的解释说明及技术支持;外围硬件设备的芯片手册被用于编写驱动程序。

  • 软件方面

对于软件方面,只要熟练运用汇编语言和C语言就足够编写操作系统了。

汇编语言用于对处理器进行配置及控制。比如:配置处理器状态,进程状态切换,中断和异常处理,设备端口I/O操作等等一些必须对寄存器进行操作的功能,或者是对性能要求比较苛刻的场景。

C语言基本就是编写操作系统的主要开发语言,它以简单高效,使用灵活深受底层开发人员的喜爱。同时对于汇编语言的嵌套和相互间的调用,也非常方便,只要根据C语言遵循的标准方法就能够实现这些功能。

除了对开发语言的熟练使用意外,操作系统作为所有资源的管理者,一些高效灵活的算法也是必不可少的。从基础的链表结构,到树状结构,再到图状结构,根据不同的场景需求,都会出现在操作系统内。除了这些算法以外,还有很多灵活的编程技巧。像内核异常处理程序的错误对照表,其原理是提前根据程序容易出错的地方,写出错误处理函数,并记录出错地址和错误处理地址,当错误发生时处理器会自动捕获错误地址,操作系统可以根据错误地址跳转到对应的处理地址处执行。这个过程需要对程序的执行地址进行巧妙的设计,运用链接脚本划分出程序的错误处理对照表。

综上所述,写一个操作系统需要的知识并不多,只需要汇编语言和C语言并且能够了解硬件电路图和硬件芯片手册就可以了。但是,为了让操作系统执行的又快又稳,其中还需要不少高效的算法,既兼顾空间开销又兼顾性能损耗。所以,写一个操作系统不难,难的是用巧妙的方法让他运行的更高效更人性化。

PS:由于是在创作初期,文章可能会有错误、内容遗漏、阐述的不到位或者读者想看而我没有写到的内容,希望大家多指点(留言或者发信息给我都可以)。
考虑到以上原因,希望大家能够关注或者推荐本书,让更多的人学习到,并避免错过之前内容的更新与补充

1.4 本书操作系统简介

在了解操作系统的结构组成以及写操作系统需要的知识后,这一节将介绍本书操作系统。

本书操作系统将Linux系统作为主要参考对象,其他操作系统为辅,写出一个操作系统雏形,并使该操作系统运行在物理平台上。这样做的好处在于,既可以对学习代码量巨大的Linux内核有所帮助;又可以方便读者在此操作系统的基础上动手实践,举一反三。而且,用物理平台代替虚拟平台运行操作系统,会大大增加读者的成就感和对操作系统的理解能力,并且能排除虚拟平台与物理平台的差异问题。下面将本操作系统分为引导启动、内核层、应用层三部分,并进行逐一介绍。

  • 引导启动

引导启动程序将使用NASM汇编语言编写,实现U盘引导启动,文件系统识别,系统内核加载,获得内存容量,获得及设置显示模式,处理器运行模式切换,页表配置等功能,以实现从启动到内核的跳转,并为内核准备相应的硬件信息和执行环境。这里涉及的关键技术包括:BIOS中断调用,VBE功能获得和设置,FAT12文件系统结构解析,E820内存地址分布,U盘与磁盘的区别,处理器体系结构分析等。

  • 内核层

内核层部分,算是操作系统的重头戏。正如上文中提到的,本系统将参考Linux内核,完成一个功能相对齐全的内核雏形。其中不乏涉及编译和链接功能,用于将程序划分出不同的代码空间。而且,内核配有内存管理模块,中断/异常处理模块,进程管理模块,多核通信模块,文件系统模块,外部硬件设备驱动等一些系统内核的重要组成部分。使之成为一个可以正常工作且功能完整的系统内核,并遵循POSIX接口标准,给应用层提供通用的编程接口。

  • 应用层

在应用层,实现了窗口管理器和一些常用的系统命令。窗口管理器将参考TWM(一款Linux下的轻量级窗口管理器)实现一个功能简单的轻量级窗口管理器,具备管理窗口布局,鼠标键盘数据发送,焦点控制等功能。系统命令将会使用内核层提供的系统调用接口,实现切换目录,创建文件,执行程序,显示目录,关机等常用系统命令。

综上所述,虽然本书操作系统参考了Linux系统,但是,并非直接对Linux系统进行裁剪而成的!只是因为这样会方便读者学习和过度,就像当年的Linux参考UNIX一样,必须先有个健全的系统雏形,才能承载我们无边无际的梦想。

PS:由于是在创作初期,文章可能会有错误、内容遗漏、阐述的不到位或者读者想看而我没有写到的内容,希望大家多指点(留言或者发信息给我都可以)。
考虑到以上原因,希望大家能够关注或者推荐本书,让更多的人学习到,并避免错过之前内容的更新与补充