首页 > 代码库 > 《嵌入式操作系统内核调度》笔记:1 操作系统基础知识

《嵌入式操作系统内核调度》笔记:1 操作系统基础知识

很偶然地搜到这本书,最近买了纸版书,作者有个新浪博客和淘宝配套的开发板,可以自己搜下。

笔记主要记录下看书时画下的,因为是说明性的文字,所以没有经过编码,自己理解也是很模糊的。

写下来发到博客上,感觉能提高学习动力,可能是有潜在的交流作用吧。

??

为什么要有操作系统?

最初的时候其实是没有的,CPU的功能不就是执行指令吗,最初人们就写个程序让计算机去跑嘛,那时是没有操作系统观念的。后来,跑了一个程序,自然就会想跑两个程序,一山不容二虎,两个程序麻烦就来了,但还不是太大,能跑两个了,人们自然想跑三个,所谓三生万物,能跑三个,人们自然就想着同时跑一堆程序。问题也随之而来,地址问题暂时不提了,怎么同时运行就是个大问题,总不能每次都等一个程序运行完了再去运行其他程序吧,这显然是无法接受的。就好比两个吵架的人,都说自己有理,你让他们自己去管理显然是不可能的,有得必有失,你可以通过添加第三者的成本来换取二人的和平共处。这就是操作系统最初的基本作用,上面是自己的理解。

操作系统说白了就是一个超级大程序,而进程之类就相当于一个个的小函数,因为CPU运行极端快速,所以一切看起来都是同时发生的,所以产生一个错觉:操作系统是有好多层次和模块的,而这些层次和模块是同时存在的(我不知道怎么描述了)。但事实上操作系统也是线性地被CPU读取指令顺序执行的,而那些看上去的所谓层次,其实也只是一个调一个的函数而已。

我们知道操作系统源文件是由很多目录和文件构成的,但是最终生成的二进制镜像其实是一个文件,所以那么多目录和文件最终是为了便于管理,你完全可以把整个操作系统写成一个文件,只是那样会变得非常麻烦,但是我觉得是可以的。分目录,仅仅是为了便于管理,就好比操作系统管理进程,我们管理操作系统同样如此。

??

操作系统最基本的功能是软件调度功能。

误解:操作系统一定要大而全。其实非也,对于一个完整的操作系统来说,它会有很多功能,但是对于小型嵌入式设备,并不要这么多,多了反而是负担,占用资源而不用。操作系统赖以生存的最核心的功能是任务调度。

??

操作系统的嵌入性和实时性

嵌入性,是相对于通用性而言的,既然是专用,那么必然涉及到硬件裁剪和软件裁剪了。

实时性,首先了解非实时性是如何造成的,非实时操作系统就是分时操作系统,按时间片依次逐个调度任务,即使有个任务很紧急,比如对某个数据采集和处理要求很迅速的任务,因为死板的时间片调度机制,而无法得到及时响应。就好比一些机构的僵化的办事流程,此时就要给他们换上实时操作系统,它是基于优先级的、抢占式,所谓特事特办,灵活性大大提高,当然难度也相应增加了,但是这个成本是值得的。

??

操作系统功能介绍

4大管理功能:

  1. 进程管理
  2. 内存管理
  3. 文件管理
  4. 设备管理

??

进程管理:不仅仅是一种软件机制(精妙的软件结构),还是一种CPU硬件机制(内存管理单元)(这个真不懂,先这么模糊理解吧)。进程就好比一个程序的运行的环境一样。进程管理涉及的方面:

  1. 进程的创建、删除;
  2. 控制资源(内存、设备等)的访问,资源争夺嘛,当然得管理;
  3. 进程间交流(也就是进程间通信),正如硬件和CPU交流是通过中断,主机间交流是通过网络,系统和进程交流是通过信号。本质上都是交流,因为交流对象的不同,所以交流的方式也不同

内存管理:其实进程管理感觉是依赖内存管理的,不过内存管理好像也要依赖进程管理吧,不知道。内存管理涉及的方面:

  1. 对内存分配、访问权限加以控制;
  2. 可以跨介质、跨空间地映射为连续的虚拟内存空间个进程使用,而这时进程赖以生存的基础。其实虚拟化也就是抽象化的基础,比如把内存抽象为虚拟内存;把物理设备抽象为虚拟设备;把存储抽象为文件系统;把各种文件系统抽象为虚拟文件系统;可以发现操作系统就是通过不断地抽取共性的东西划为一层,然后通过驱动机制偶尔共性层和具体层的,从而达到简化设计的目的;

文件管理:文件是什么?文件是数据。数据来源是什么?数据来源多种多样,可以是键盘输入到终端,也可以是硬件采集来的,也可以是网络数据。我们把数据封装为文件,从上层再把数据看成文件。所以把设备看成文件也就不足为奇了,因为设备本质上也是一种数据来源,而系统又通过文件这种最原始的方式来统筹管理数据,那么设备自然就成为一种文件。

设备管理:抽象!抽象!抽象(向上提供结构,向下实现操作)!管理就是抽象,抽象是为了简化编程,否则抽象的东西就要程序员自己做。所以设备管理一般会将设备抽象化,将物理设备抽象成逻辑设备,这样在编程时可以做到与具体的物理设备解耦,方便对设备的管理,而耦合的工作就交给驱动去做了

??

选择模型:为了简化多选造成的各种组合,我们在多选中插入一个点(中间层(中间层这么说可能不恰当啊,因为还有个胶合层,我也不理解是什么?)),实现多对一或者一对多。

??

------------------------------------------------上面提的都是一个通用操作系统的功能,如果缺少一些功能也能叫做操作系统,千万不要认定操作系统必须具备这些功能,就好像认定操作系统都必须长得像windows,这是长期不愿意接受新概念导致的。

??

说说小型嵌入式设备的特点:

  1. 因为没有MMU硬件单元,所以无法实现内存管理,也就不能实现进程机制。但是支持任务机制,可以把这里的多任务看成多线程,我们只能在嵌入式设备上运行一个进程,但这个进程可以管理多个线程,不知道这么理解对不对;
  2. 内存管理涉及地址转换、映射、保护等诸多功能,因为无法实现,所以嵌入式操作系统只能从软件层对内存申请、释放;
  3. 小型嵌入式设备几乎没有文件的概念,它用来保存永久数据的非易失性存储机制一般是FLASH\EEPROM等,容量较小,一般是几KB到几百KB,连1MB都不到,所以一般只会保存一个目标程序或者一些常量数据,存储在其上的数据没有任何文件格式,因此也就谈不上文件管理了;
  4. 小型嵌入式设备的外设也比较少,而且只有一个程序(进程)使用,只要直接实现驱动就可以了,而不用把设备抽象出来便于编程,所以不需要设备管理机制了;
  5. 调度功能是操作系统所必须具备的功能。

??

------------------------------------------------本书实现的两个最小操作系统:

非实时非抢占式操作系统Wanlix

  1. 编码从实现2个任务切换扩展到任意多个任务间切换;
  2. 为用户封装一个用户入口函数,拼壁操作系统内部初始化过程;
  3. 增加任务入口参数功能,可以在任务创建时提供初始参数;
  4. 这就类似Linux系统编程里学的fork()和exec()嘛,这个两个具体怎么操作现在忘了。

??

实时抢占式操作系统Mindows

  1. 编码实现任务实时切换调度;
  2. 为了方便观察任务切换过程,增加钩子函数功能;(很人性化)
  3. 为了任务能结束运行,增加任务删除和任务自动结束功能,并增加任务自动申请任务栈功能;
  4. 信号量是实现操作系统资源互斥和同步的一种重要机制;
  5. 队列是任务间通信的一种重要机制;(队列怎么成通信机制了?不明白,到时候看看)
  6. 为Mindows操作系统增加一些可裁剪的功能,程序员可以根据自身需求选择是否编译这些功能;这个和Linux内核编译好相似啊,内核有很多模块,而我们可以通过make menuconfig决定是否编译一样;
  7. 书里面提到了好多调度相关的功能,感觉都听懂是啥,有点紧张。

??

原则:

简化上层工作,封装下层实现。而方法就是抽象。

程序员的本能是模仿,做其他事其实也一样,就好比婴儿学步,这应该是学习的规律吧。所以千万不要鄙视和护士模仿这种方法,这是不符合规律的。而是自大。

就用管理权去理解引用,不要把引用看成引用。

把进程看成一个人,进程管理就是管理一群人,而不要把进程仅仅看成进程。

线程就好比一个人的任务,而不用仅仅从代码层看待线程。

函数:代理/仆人/机器,根据函数的作用,它会扮演不同的人。

参数:命令。

返回值:反馈。

我们说的驱动的实现上无非就是一个.c的源文件,虽然讲解起来感觉很有立体感,但是代码实现却是扁平的,而且也没有什么新的C语言语法。

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

《嵌入式操作系统内核调度》笔记:1 操作系统基础知识