标签:
很偶然地搜到这本书,最近买了纸版书,作者有个新浪博客和淘宝配套的开发板,可以自己搜下。
笔记主要记录下看书时画下的,因为是说明性的文字,所以没有经过编码,自己理解也是很模糊的。
写下来发到博客上,感觉能提高学习动力,可能是有潜在的交流作用吧。
? ?
为什么要有操作系统?
最初的时候其实是没有的,CPU的功能不就是执行指令吗,最初人们就写个程序让计算机去跑嘛,那时是没有操作系统观念的。后来,跑了一个程序,自然就会想跑两个程序,一山不容二虎,两个程序麻烦就来了,但还不是太大,能跑两个了,人们自然想跑三个,所谓三生万物,能跑三个,人们自然就想着同时跑一堆程序。问题也随之而来,地址问题暂时不提了,怎么同时运行就是个大问题,总不能每次都等一个程序运行完了再去运行其他程序吧,这显然是无法接受的。就好比两个吵架的人,都说自己有理,你让他们自己去管理显然是不可能的,有得必有失,你可以通过添加第三者的成本来换取二人的和平共处。这就是操作系统最初的基本作用,上面是自己的理解。
操作系统说白了就是一个超级大程序,而进程之类就相当于一个个的小函数,因为CPU运行极端快速,所以一切看起来都是同时发生的,所以产生一个错觉:操作系统是有好多层次和模块的,而这些层次和模块是同时存在的(我不知道怎么描述了)。但事实上操作系统也是线性地被CPU读取指令顺序执行的,而那些看上去的所谓层次,其实也只是一个调一个的函数而已。
我们知道操作系统源文件是由很多目录和文件构成的,但是最终生成的二进制镜像其实是一个文件,所以那么多目录和文件最终是为了便于管理,你完全可以把整个操作系统写成一个文件,只是那样会变得非常麻烦,但是我觉得是可以的。分目录,仅仅是为了便于管理,就好比操作系统管理进程,我们管理操作系统同样如此。
? ?
操作系统最基本的功能是软件调度功能。
误解:操作系统一定要大而全。其实非也,对于一个完整的操作系统来说,它会有很多功能,但是对于小型嵌入式设备,并不要这么多,多了反而是负担,占用资源而不用。操作系统赖以生存的最核心的功能是任务调度。
? ?
操作系统的嵌入性和实时性
嵌入性,是相对于通用性而言的,既然是专用,那么必然涉及到硬件裁剪和软件裁剪了。
实时性,首先了解非实时性是如何造成的,非实时操作系统就是分时操作系统,按时间片依次逐个调度任务,即使有个任务很紧急,比如对某个数据采集和处理要求很迅速的任务,因为死板的时间片调度机制,而无法得到及时响应。就好比一些机构的僵化的办事流程,此时就要给他们换上实时操作系统,它是基于优先级的、抢占式,所谓特事特办,灵活性大大提高,当然难度也相应增加了,但是这个成本是值得的。
? ?
操作系统功能介绍
4大管理功能:
? ?
进程管理:不仅仅是一种软件机制(精妙的软件结构),还是一种CPU硬件机制(内存管理单元)(这个真不懂,先这么模糊理解吧)。进程就好比一个程序的运行的环境一样。进程管理涉及的方面:
内存管理:其实进程管理感觉是依赖内存管理的,不过内存管理好像也要依赖进程管理吧,不知道。内存管理涉及的方面:
文件管理:文件是什么?文件是数据。数据来源是什么?数据来源多种多样,可以是键盘输入到终端,也可以是硬件采集来的,也可以是网络数据。我们把数据封装为文件,从上层再把数据看成文件。所以把设备看成文件也就不足为奇了,因为设备本质上也是一种数据来源,而系统又通过文件这种最原始的方式来统筹管理数据,那么设备自然就成为一种文件。
设备管理:抽象!抽象!抽象(向上提供结构,向下实现操作)!管理就是抽象,抽象是为了简化编程,否则抽象的东西就要程序员自己做。所以设备管理一般会将设备抽象化,将物理设备抽象成逻辑设备,这样在编程时可以做到与具体的物理设备解耦,方便对设备的管理,而耦合的工作就交给驱动去做了。
? ?
选择模型:为了简化多选造成的各种组合,我们在多选中插入一个点(中间层(中间层这么说可能不恰当啊,因为还有个胶合层,我也不理解是什么?)),实现多对一或者一对多。
? ?
------------------------------------------------上面提的都是一个通用操作系统的功能,如果缺少一些功能也能叫做操作系统,千万不要认定操作系统必须具备这些功能,就好像认定操作系统都必须长得像windows,这是长期不愿意接受新概念导致的。
? ?
说说小型嵌入式设备的特点:
? ?
------------------------------------------------本书实现的两个最小操作系统:
非实时非抢占式操作系统Wanlix
? ?
实时抢占式操作系统Mindows
? ?
原则:
简化上层工作,封装下层实现。而方法就是抽象。
程序员的本能是模仿,做其他事其实也一样,就好比婴儿学步,这应该是学习的规律吧。所以千万不要鄙视和护士模仿这种方法,这是不符合规律的。而是自大。
就用管理权去理解引用,不要把引用看成引用。
把进程看成一个人,进程管理就是管理一群人,而不要把进程仅仅看成进程。
线程就好比一个人的任务,而不用仅仅从代码层看待线程。
函数:代理/仆人/机器,根据函数的作用,它会扮演不同的人。
参数:命令。
返回值:反馈。
我们说的驱动的实现上无非就是一个.c的源文件,虽然讲解起来感觉很有立体感,但是代码实现却是扁平的,而且也没有什么新的C语言语法。
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
标签:
原文地址:http://www.cnblogs.com/dcscodelife/p/5817380.html