操作系统大家可能很陌生,也可能不陌生。不陌生的原因是现在几乎每个人每天都在和操作系统打交道,不是和计算机上的操作系统打交道,就是和手机的操作系统打交道。陌生的原因是,大家可能被她那华丽的用户界面遮住了双眼,以至于看不到她
那神秘的身形。可是这个神秘的她究竟在幕后操控着什么,干了些什么坏事、什么好事,她好像掌控着计算机的一切。谁也逃不掉,包括使用计算机的我们,除非你不使用计算机。于是我就带着一份好奇,认真的研究了她,并亲自用代码实现了一个真正
可以在x86物理机器上正常运转的内核。并且具备现代意义操作系统的大部分特性。大家可能觉得我很傻,是的,我自己也这样认为的,不仅傻而且有些“神经”。因为现在软件的主题是,高层框架及应用。很少有人去研究这些底层核心的基础软件。
但是有两点不管大家认不认同,我是认同的,第一如果没有基础软件,什么框架,什么应用都是空谈。第二我如果去搞框架、应用,那么我将永远无法知道这些底层的细节。
关于我的LMOS,还是从我的操作系统梦开始说起。
关于我的操作系统梦
这个梦想发源于2008年初, 那时候我刚刚接触C语言,因为我喜欢计算机编程。我像很多人一样,在我的计算机上写了这样一个程序:- int main()
- {
- printf(“hello world!”);
- return 0;
- }
我想这个程序很多人都写过,当我编译运行时,计算机屏幕上出现了hello world!。说实话我当时并没有大多数人第一次成功运行时的惊喜,相反给我一种奇怪的感觉,显然这个程序完成输出hello world!功能的主要函数是printf()。可是这个函数哪儿来的,在我的程序中从来没有实现过。我当时就奇怪啊,最后我通过Google知道了答案,这是个库函数,它最终会调用操作系统的。这个答案顿时让我的心情一落千丈,甚至很伤心,因为在我的想像中,我的代码应该是能控制计算机所有的行为
的。不过还好,我知道了我的计算机里存在着操作系统,就是它在控制着我们的计算机。接着,我又Google了C语言的历史,因为我想知道我学了它究竟能干点什么。于是我发现了UNIX,咦,UNIX是何物,平日周围玩计算机的朋友们嘴里都叨唠着什么
windows 2000啦、windows xp啊。进一步Google才发现UNIX是一个非常伟大的操作系统,并且还让我知道了,开发C语言那两位科学家开发C语言就为了写UNIX系统。啊!这个答案让我的心情畅快了不少,也正是这个答案,在我的心中埋下这样的
一个梦。
关于我的操作系统
我在经过了三年的学习之后,先后学习C,x86汇编,数据结构,编译原理,操作系统理论以及硬件体系结构方面的资料后,我的操作系统旅程开始了……最初只是为了满足一下自己的求知欲,好奇心,只是为了过过瘾。后来我就想为什么不把自己过瘾的成果拿出来分享呢,想到这里我废弃了我写了三个月所有的代码。从安全、稳定、性能、及可扩展性和可维护性方面进行了全面的考虑和全新的设计。确切的说这不是一个完整的操作系统,只是一个操作系统内核。我给这个刚刚起步的内核起了个名字即LMOS,L,liberty也,为什么不是free这是有原因的……我是一个向往自由自主的人,当然是精神上的自由,比如让别人的代码控制我的计算机我就不开心了……M,madness也,我觉得吧,一个人写操作系统内核确实让人感觉是一件很疯狂的事,但就算疯狂我也觉得自豪。这也可能是我自我感觉良好吧。
LMOS内核有什么特性呢,大家首先看看总框架图吧,别人说一图解千言。
首先简单说一下LMOS内核的特性,LMOS内核包括了进程管理、内存管理、文件管理和IO管理将来可能会加入电源管理。由于它只是个内核,所以暂时没有考虑用户操作接口,应用软件编程接口,等我完善了驱动程序框架后,我会对外公开应用
软件编程接口,和驱动程序编写接口。
进程管理
下面我们就来说说LMOS内核的进程管理器的特性,大家先请看图:
进程的提出要回到上世界50年代,它是个非常重要的概念,是操作系统内核实现多任务的重要机制,是对一个运行时程序的资源集合的抽象。我曾天真的想提出一种全新的机制,但是我没有想出比这更好的了。每个程序要运行LMOS都为此程
序创建一个进程,在这个进程内部LMOS会创建一个默认的线程。当然一个进程可以有更多的线程,是的,LMOS是一个多进程多线程的内核,事实上LMOS的CPU调度器,调度的基本单元是线程而非进程。至于为什么要提供多线程的机制,请大家
看看相关文档。大家伙儿,大可以这样认为操作系统内核对进程线程的管理,就是对计算机的CPU进行管理。LMOS内核最多支持8线程的CPU,为什么不是8核、8颗,这是有区别的,因为现在一颗CPU可以有多个核心每个核心又可以有多个线程,一
搬是一核有两个线程,前提是该CPU核支持多线程。当然一个CPU核至少可以运行一个线程。更多细节请参阅intel超线程技术和SMP规范。如果大家觉LMOS支持8线程的CPU少了的话,可以和我交流,我只需要改变这个宏#define LMOS_CPU_MAX_NRS 8 就行了。至于调度算法嘛,采用的是动态优先级的算法,这个以后我以后会改进的。
内存管理
每个现代意义的操作系统内核都必须对内存进行高效的管理,内存是所有软件包括内核运行时不可缺少的资源。一个内存管理器是否高效健壮,将直接影响整个操作系统的效能和安全。大家先看看内存管理器的框架图吧:
LMOS内核是一个基于intel x86平台的全32位内核,所以最多支持不超过4GB的物理内存。将来我可能会开发64位的内核。LMOS内核的物理内存管理是基于CPU分页机制的,CPU的MMU部件通过页表把CPU的虚拟地址映射成物理地址的。但是
intel x86 CPU 必须先经过分段在才能分页,实际上我的LMOS内核采用的是平面分段模型,这就轻松的绕过CPU的段机制,直接应用分页机制。这算是把CPU忽悠了一把。事实上有了分页,分段是多余的。intel这么做是为了兼容,为了兼容又何
只一此,比如那丑陋的A20地址线、那排的乱七八糟的段描述符。最让我沮丧的就是那个TSS任务状态段。LMOS内存管理算法是采用SUN公司(我是个怀旧的人)提出的伙伴系统算法。这个操作系统理论书籍上也有介绍。非常优秀的算法,linux
内核也是采用这种算法,说到这里,本人郑重申明:我的LMOS内核没有抄袭任何开源操作系统的一行代码,甚至一个字符。
IO管理
IO实际上是一个非常重要的,我很难想像一操作系统不能处理IO,它还能叫操作系统吗。别看操作系统理论书籍上花大量的篇幅讲解进程,IO只是很少一部分,当你实际去实现一个可以运转的操作系统的时候,相信我你一定会发现,实现IO
的代码量比实现进程代码量,多出不只一个数量级。大家同样先看图:
想要对计算机中令人眼花缭乱的IO设备进行标准一致的管理,就需要层层抽象。因为每个IO设备的特性都不一样,它们的功能、速度、存在的形式、以及对操作它们的方式都千差万别。搞那么多抽象层,当然不是无聊,就是为了在不同的层中屏
蔽它们各自的差异。暂时也没可以什么新特性可以向大家介绍,因为IO框架还待完善。
文件管理
LMOS内核的文件系统是一个基于B*树的数据结构的,我还在开发之中没有完成不过我一定会完善它的,请大家试目以待。有图为证:
关于我的操作系统开发使用的工具链
LMOS内核开发大概有10%的纯汇编代码,5%的嵌入式汇编代码,85%的C语言代码,总共4万多行。纯汇编代码是用NASM编译的,因为我不喜欢GAS的汇编语法,有时常常出错,C语言代码是用GNU的GCC,链接工具也是GNU的LD。感谢这些优秀的工具,没有它们我的LMOS内核也只能是代码。GCC编译器确实很强大,代码优化也算好,提供了许多扩展特性,还有它的后端支持许多CPU,这个世界很难在找出这么优秀的编译器了。一开始我想开发一种全新的编程语言,它应该包括C的所有特性,但是比C还更接近于硬件,然后用这种语言去实现我的LMOS。后来我父亲说你神经病啊,是啊一个人写系统内核已经很疯狂了。
关于LMOS是否开源
首先我开发操作系统内核,一是出于一种求知欲,怀揣着好奇,秉着对计算机的热爱。二是我是一个脑瘫患者,无法向正常人一样生活、工作。整日在家除了用计算机上上网,就喜欢捣鼓计算机了。读书不多,由于身体原因只念到初中。好了说正经
的,开源这事儿,等我代码比较成熟之后我会考虑的,不是现在,代码太烂我怕高手们会笑话。
关于LMOS的维护
我会平均每个月更新一次,不断的完善,不断的加入新的特性,直到可以实际应用为止,目前还不能完成任何功能,LMOS只能初始化并启动计算机,shell进程只能简单响应用户键盘输入,不能做任何事情。但是我说过,我一定会不断的完善LMOS,
直到可以使用。还望大家给予支持和关注。
LMOS会在2012.10.1放出二进制文件和虚拟硬盘镜像和大家见面!!
阅读(1144) | 评论(0) | 转发(0) |