在进行嵌入式开发的时候,尤其是在进行较大规模的嵌入式开发时,对于原来的裸机开发已经难以支撑一个较大项目的嵌入式开发,因此这里需要采用操作系统的方式,通过操作系统来实现各个任务的实现。
因此这里对于操作系统,进行一个学习。通过博客来记录一些学习笔记。
操作系统五花八门,但是其内核的实现基本相似。一般来说,操作系统需要实现进程管理、存储管理、文件管理、设备管理这几个功能。
在具体介绍各个功能实现之前,我们需要对一些基本的内容进行了解,首先对操作系统内核进行简单的介绍。明白,操作系统功能的实现,实际上是中断机制和系统时钟相互配合的结果。
然后我们再来看进程管理、存储管理、文件管理、设备管理等功能是如何实现的。
操作系统的内核,是操作系统中,实现进程管理和调度的程序模块。其实现离不开时钟与中断。
操作系统内核的实现,离不开几个重要的机制:中断机制和系统时钟。
首先先说,中断机制对于操作系统的重要性。
之所以操作系统可以进行进程管理,是因为中断机制具有以下几个特点:
有了上述特点,才能进行任务之间的切换、任务状态的保存,任务之间的选择执行。所以说,操作系统内核,离不开中断。
然后再说系统时钟,仅仅有中断机制并不能实现操作系统,因为操作系统需要对任务进行周期性的管理,而不是随意的进行中断,因此必须要有一个固定时间间隔的周期性信号,来帮助操作系统获得时间的概念,这就是系统时钟。由系统时钟引起的中断服务程序叫做时钟节拍服务。
提供中断处理、进程的调度管理、系统的基本操作三个方面的功能。
内核是操作系统对裸机的一次封装。
如果把所有的为进程服务有关的模块都放在操作系统的内核中,那么操作系统的内核可能就变得非常冗余。会产生许多问题,因此我们常常需要一个较小的内核。常见的两种实现方法为:
宏内核和微内核。
宏内核是虽然内核被划分成许多模块,但是其在运行时是一个整体,模块在内核内部,模块之间的通信不是信息传递,而是调用其他模块的函数。
微内核是,将操作系统中的许多模块如进程管理、设备管理、文件管理等,作为一个进程放在内核外面,操作系统的内核只负责信息传递,这样操作系统的内核就可以很小,并且还可以根据需要对操作系统的功能进行裁剪。
了解了操作系统实现的两个基础机制,我们来具体看操作系统的功能。首先就是进程管理。
首先我们要理解什么是进程,在我的理解,进程就是处理器对某些资源、代码、数据进行一系列的处理的行为就叫做进程,往往这一系列处理行为是以某些功能、目的的实现为联系的。
就像,处理器是一个老师,进程就是等待批改的一张试卷。
进程还有一个重要的特点,那就是进程是系统分配资源和进行调度的独立单位。
一个进程包括以下三个部分:
就像试卷的姓名、学号等,进程控制块就是为了方便识别、管理、描述、记录等而给进程分配的数据结构。一般来说以一个结构体的方式来出现。
一般来说,进程至少具有以下三种状态:
。
从进程在内存中的所有存储映像来看,我们可以看到,在内存中的存储有一下几个部分:
1. 存有该进程的进程控制块:控制进程的运行
2. 该进程的数据存储区域:进程运行涉及到的数据
3. 该进程的程序代码存储区域:进程的运行代码
4. 该进程的堆栈存储区域:中断时用于存储进程的堆栈空间
四个部分
开始的时候,人们把进程作为系统分配资源的基本单位。但是这种系统进行进程运行的时间和空间开销太大,就像老师必须批改完一张试卷后才批改下一张试卷,每张试卷花费的时间太多。
因此后来人们把处理器的资源进行划分,出现了线程。因此有以下新的改变,对于存储空间资源的分配,仍然以进程为单位进行分配,但是对于处理器资源,则以线程为单位进行分配。总而言之,进程是系统分配资源的基本单位,线程是系统调度的基本单位。
进程管理主要是以下几个方面的内容:
进程的调度:
进程的调度有两类,一类是可剥夺方式,一类是不可剥夺方式。
可剥夺方式下,优先级高的进程可以剥夺优先级低的进程的处理器使用权。
常用的调度算法有以下几种:
1.时间片轮转法:该方法是每个进程轮流占用处理器运行一个相同的时间片。通过队列的方式,从队首开始执行,执行一个时间片后,将该进程插入到队尾,然后执行下一个进程,这样不断循环执行。
2.优先级调度法:在调度器调度时,通过观察就绪进程的优先级,选择优先级级别大的进程来执行。
3.多级反馈队列调度法:把进程分成若干个优先级组,同一组的进程的优先级相同。并且把每组进程通过一个先入先出的队列进程组合,按照优先级级别高的组,应得的时间片越短的原则分配时间片。在调度的时候,调度器每次都从优先级高的分组开始,当优先级高的分组中没有进程了,才到低优先级的分组中选择进程来执行。
进程的切换,实际上就是将正在运行的进程的中间数据存在该进程的私有堆栈,并记录该进程的断点指针,然后将要运行的进程的中间数据从该进程的私有堆栈中提取出来,然后从该进程的断点指针处开始执行程序。
主要涉及到的寄存器是PC寄存器,PSW寄存器,SP寄存器等。以及主要通过压栈指令、出栈指令等汇编语言来实现。
进程之间可能会出现,多个进程需要共同使用一些共享资源,以及进程之间的通讯,进程之间的顺序同步等问题。
许多进程之间存在着互斥关系,或者说执行上有先后次序,因此需要进程之间进行同步。
进程之间的同步是通过进程之间的通讯来实现的。在操作系统中,进程之间通讯的方式,是通过信号量、邮箱、消息队列等被称作事件的中间环节来实现的。把信息发送到事件上,叫做发送事件。读事件的操作叫做请求事件。
进程的创建,进程的删除,进程的挂起,进程的恢复都算进程的控制。
操作系统另一个十分重要的功能就是对内存进行管理。
首先先介绍一下计算机存储器的分层。
存储的距离离处理器越近,那么处理器读取和存放数据的速度越快。
我们在进行芯片选型的时候,常常关注芯片的存储大小,RAM和FLASH大小。
其中FLASH主要用于存放系统的运行代码,操作系统内核等,因此如果我们的项目工程量较大,所编写的代码较多或用到了较为复杂的操作系统内核,那么就需要较大的FLASH。
而RAM往往用于存储一些运行数据,其概念等同于PC电脑的内存大小。内存越大,那么操作系统在运行时就能够缓存和调用更多的数据。
存储空间的划分是段页式的分区划分。
通常来说,一个存储单元的存储大小为一个字节(1B),而我们所需要占用的存储空间远大于一个字节,并且我们的存储器总量的大小也远大于一个字节,为了方便对存储器进行管理,操作系统对存储器进行了一些划分。
常见的操作系统先分段,再分页,页内的存储地址用偏移量来表示(页内偏移量),例如Linux操作系统;有些小的操作系统只分段,不分页,段内的存储地址用偏移量来表示(段内偏移量)。即通过以下两种方法来表示一个存储单元:
段号+段内偏移量
段号+页号+页内偏移量
这个概念就像,所有的存储空间是一个城市,一个存储单元是一个房子,如果我们直接在一个城市里面寻找一个房子,是比较困难的,因此我们对城市的房子进行划分,首先进行分区,武侯区,青羊区,等价于操作系统的分段;然后划分街道,望江路街道,等价于操作系统的分页;然后标出房号,等价于操作系统中的地址偏移量。有些小的城市只划分街道,不划分市区,相当于操作系统只划分段,不划分页。
通过分页管理存储空间,系统就可以将一个较大的程序按页为单位存储数据,这些页可以不用连续,而可以通过链表的方式将页联系起来。这样就可以减少内存碎片的存在,提高存储空间的利用率。
而分段管理存储空间,除了具有模块式的管理存储空间的功能之外,往往还有一些逻辑关系在其中,一个段内的程序往往具有相同的意义,例如主程序段、子程序段、数据段、堆栈段等。通过分段,我们就赋予了不同存储地址不同的功能,方便我们管理。
假如说,处理器的地址位数为32位,那么对应的内存容量为4GB,但是实际上计算机的真实内存空间(内存空间而不包括外部存储设备)肯定是远小于这个容量的。
为了避免地址空间的浪费,在编程的时候可用地址是全部地址位数,这样我们在编程的时候就可以不用考虑实际的存储地址,可以从地址0用到地址END。不过我们所编写的程序大部分情况下是存储在外部存储空间的物理地址中。
我们知道,一个操作系统的内存大小往往小于外部存储器的大小,因此计算机在运行时,将外部存储器中的数据先缓存到内存空间中,当需要用到其他部分时,再将其他部分缓存进来,把之前的卸回磁盘。
这就是虚拟存储技术。
设备管理时操作系统的又一大功能。
由于许多功能的实现往往需要操作系统和设备共同协调运行才能实现,因此操作系统需要对设备进行管理。
设备管理的主要思想是将设备管理抽象化,不具体的依赖于设备的细节,而是对设备的管理进行抽象。从而增加设备管理的适用性。
换句话说,如果操作系统需要对不同的设备提供不同的架构进行管理,那么这种操作系统只能对单一某些具体设备进行操作,灵活性差。因此我们将不同的设备都抽象成一种具有相同架构,相同特征的设备,操作系统需要对这一种设备进行管理,而设备只需要将自己封装成具有该架构的设备。
操作系统中最常用的设备就是存储器,因此我们把其他的设备也抽象成存储器,因此其他设备就需要有以下特点:
操作系统对设备的管理主要有三个内容,缓冲、调度、分配。
解决处理器和外围设备工作速度上的不匹配,如果外围设备数据传输速度大于处理器处理速度,那么就有可能造成数据的丢失;如果外围设备数据传输速度小于处理器处理速度,那么就有可能造成处理器一直在等待外围设备。因此操作系统通过缓冲的方法,如单缓冲、双缓冲、多缓冲等,将数据暂存在主存储区中,从而一定程度上改善速度不匹配的问题。
设备可以被进程访问,如果多个进程都要访问一个设备时,那么就需要操作系统对设备访问进行调度。换句话说,如果多个进程等待同一个设备时,设备如何选择进程来执行。
常用的设备调度方法是先来先服务,但是对于磁盘调度,出于提高磁盘的效率的考虑,采用寻道时间最短调度。
设备的分配是指,当设备资源出现共享竞争时,按照分配策略为申请设备的进程分配设备。
文件是一种信息的组织形式。存放在外存储器中。
文件系统是操作系统中负责存取和管理文件的软件模块,主要有两个基本功能:
此外还有一些其他功能,例如文件和目录的操作接口,文件和文件目录的管理,多个用户共享文件时的安全措施等。
创建一个文件时,文件系统会为该文件建立一个文件目录。文件目录是记录了文件属性的结构体,通常包括以下信息:
此外,为了方便对文件目录进行管理,操作系统将所有目录整合在一起组成一个文件,叫做目录文件。目录文件有单级目录文件、二级目录文件、树型目录文件
文件存储涉及两个方面,一是存储空间的分配单位,二是空闲空间的组织、分配、回收。
前述所述,文件存储一般来说是按块存储。常见的存储大小为512B,1KB,2KB。
文件系统需要掌握存储空间中哪些物理块是空闲的,哪些是被占用的。记录和管理空闲空间的方法是建立一个位图,用0和1来表示物理块的空闲状态,或者通过链表的方式,将空闲块组成一个链表,分配空间时从表头摘取物理块,回收空间时,将回收的空闲块链入链表末尾。