- 经验
- 8732
- 分贝
- 100
- 家园分
- 13940
- 在线时间:
- 785 小时
- 最后登录:
- 2024-3-27
- 帖子:
- 8242
- 精华:
- 0
- 注册时间:
- 2009-4-28
- UID:
- 523676
注册:2009-4-28439
|
操作系统的故事-KLINUX
这部分有点硬;
要想让linux达到与vxworks相当的水平,必须对linux 做大手术,linux本质不是应用于强实时的嵌入系统的,我们打算留一个linux的壳子,把里面换个遍。
首先是调度器,当时的Linux版本是2.4.18,是不支持实时抢占的,而且其调度的复杂度是O(N),我们参考其他嵌入操作系统内核,修改成基于bitmap的实时抢占内核,复杂度也变成了O(1),性能有了明显的改善;
其次是内存,原先支撑层的内存管理,性能比linux原生的好,而且功能也很强大,也一并移植到内核里面;
然后把我们开发的动态补丁,堆栈回溯等功能都移植进去,对比vxworks,把不足的功能全部在linux内核态里面补齐,就这样,除了文件系统,linux内核被我们改了个遍,通过这种优化,性能基本达到vxworks的80%-90%,经过仔细分析,我们发现,这些差距主要是vxworks编译器的差距,而不是内核本身的差距了。这样,经过大规模优化的linux基本上就达到了可以与vxworks一拼的程度,因为这10%-20%的性能差距,在应用层,几乎可以忽略不计的。
移植中,也解决了大量的疑难问题,使得我们对操作系统的理解更加深刻,举个例子,我们当时为了解决数据访问冲突,移植并使用了信号量机制做互斥,但是发现内存管理的性能很差,因为每次型号量操作其实都会引发调度器,我建议关中断来进行互斥,但是关中断这种操作其实很危险,于是我仔细分析信号量的代码,发现里面其实也用到了关中断,这样我们就放心了,在核心代码里面都是用关中断做互斥。
在优化过程中,我们需要不断地与vxworks对比测试,时间久了,我们也掌握了操作系统性能的一整套评估分析的理论与方法。
一个操作系统,除了内核以外,配套的工具也是必不可少的,其中最重要的就是调试器,linux本身是有自己的调试器的,可是内核已经被我们改得乱七八糟了,原来的GDB已经无法使用了,所以必须还得搞一个调试器出来。
在刚开始做linux内核修改的时候,我预计我们需要一个调试器,巧的是,我们的一个实习生LF的老师,正好也是做这个的,LF这个实习生的能力特别强,于是我提前安排LF研究调试器,在内核开发差不多的时候,调试器也基本上有了眉目,参照vxworks的模式,我们开发了一个调试器出来,虽然功能比较有限,而且还是字符界面的,但是已经支持attach到被调试的任务,设置断点,单步,显示调试信息等功能,可以满足基本的开发需求。
LF毕业后留在了我们团队,后来也去了美国。
这样,一个强实时的嵌入操作系统就被我们这么东拼西凑地搞出来了,我们给他取了一个名字,叫Klinux,意思是内核态linux。
|
|