使用的代码包为cosmos14395.zip,以下把COSMOS里程碑1简称为COSMOS MS1或 MS1 COSMOS
申请:由于本篇内容涉及的技术的东西太多,小弟水平有限,如有思想认识上的错误,欢迎大家指正。
对于IBM-PC兼容机的硬件启动流程我目前理解是这样的:通电->BIOS初始化与自检->CPU初始化->加载硬盘的0磁道0柱面1扇区的内容进内存并开始执行这一部分的内容。到此,硬件的过程—注意是硬件--就走完了,剩下的就都交给0磁道0柱面1扇区的程序来执行,这里面的东西就是我们程序员要做的东西了。
这里如果没有操作系统的话,那么从0磁道0柱面1扇区开始执行的程序就是我们自己写的程序,但这样一次只能执行一个,很浪费硬件资源,如果要换别的程序的话还得重新启动一次硬件,所以我们希望这个首先执行的程序可以一直运行,然后再向这个程序发出命令,让这个程序来执行我们想要执行的程序,这样就可以不用重启硬件就能运行多个程序了,慢慢地这个我们对其发出命令让其运行别的程序的程序就变成了我们所谓的操作系统了。
随着操作系统的发展,现代操作系统的一般都需要做以下工作:
1. 进程管理
2. 内存管理
3. IO管理
4. 文件系统管理
(以上为参考《操作系统的设计与实现》一书)
对于我们这次要分析的COSMOS MS1,那么他实现了以上哪些功能呢,严格来说都没实现(第一个里程碑版本嘛,能运行就可以了),要说的话可以说实现了一些IO管理上的功能,如向显示器上输出字符和相应键盘输入。下面通过一副图来说一下COSMOS
MS1操作系统(即PC机软件部分)的启动过程:
再说明一下,本版本使用VS2010编译之后似乎无法正常运行,这里是我个人的理解:里程碑1的程序还是VS2008的项目,如果使用VS2010的朋友在打开项目之后会提示升级,升级完后编译会出现部分无法编译通过的情况,是因为升级之后部分项目升级成使用.net 4.0的框架,而部分项目还是用的.net 2.0或3.5的framework,当使用.net 2.0或.net 3.5的项目引用了.net 4.0项目的程序集时,是无法通过编译的,这时尽管把这些项目该为使用.net 4.0的framework后可以正常启动进到编译界面,但是编译操作系统的过程中会出现“未将引用设置到对象”错误,原因不明………..
好了,了解了流程就直接上代码,跟着代码逐行进行说明,找到Program文件,定位到以下代码
主要分析一下Kernel.Boot.Default()这个函数干了什么事,前面一大堆理论中关于CPU,内存,IO初始化这些的操作都是在这里面完成的
再看一下Cosmos.Hardware.PC.Global.Init()里面做了什么
这样就算是基本完成了,当然,对于不同的操作系统,初始化的流程可能会不一样,这得根据实际的硬件情况来决定。
以上的初始化函数中大量调用了这个操作:void Write8(UInt16 aPort, byte aData)
这个是直接往端口中写入数据,根据IBM-PC兼容机的端口说明,对不同的端口进行初始化其实就是往相应的端口中写入不同的数据(但通常都是写入数据0)
这里完了之后我们再跳回到上一层函数,看看Keyboard.Initialize()里面做了什么
好了,硬件的设置(初始化)总算完了,让我们回到最上层的函数看看接下来的是什么。
在这之后操作系统的任务就算是基本完成了,剩下的就应该是程序的调度运行的工作了,从源代码中可以看到COSMOS是直接运行了一个猜数的程序,我们看一下运行截图:
好了,COSMOS MS1的启动流程和运行到这里就算是结束了。但是还有几个问题没有解开,比如:System.Console.WriteLine(string)这个函数。对于在.net framework环境下编程的朋友可能还没有意识到,问题在什么地方。
首先System.Console.WriteLine是向显示器上显示字符,但是在我们刚才的代码中没有看到与显示器设备初始化相关的代码,在.net 环境下之所以能够向显示器上输出字符是因为.net framework在程序启动之前已经进行了这部份相关代码的加载,当程序中遇到System.Console.WriteLine类似的函数调用时,其实是调用的.net framework中的代码来实现的,这就是为什么我们在编写.net 程序的时候需要引入相应的dll,这些加载代码就在这些dll里面。
但是COSMOS是独立于.net framework来运行的,也就是说COSMOS在运行时是没加载过任何.net framework中的dll,这部分功能的实现COSMOS是通过编写自己的程序库(Plugs)来完成的,这个部分上一篇文章介绍IL2CPU编译器时小小地涉及了一下,更多的内容将在下一遍文章中说明,呵呵(诶呀!谁扔过来的鸡蛋!)
欢迎大家实践学习交流,任何意见和错误都欢迎指出,一起学习,共同进步 J
广告时间:欢迎光临小弟的淘宝话费充值小店捧场,呵呵
参考资料:
《程序员的自我修养—连接、装载与库》
《操作系统的设计与实现》--上册
《深度探索C++对象模型》
鸟哥的LINUX私房菜
Intel Vol 3A System Programming Guide Part 1
《编译原理》—“龙书”第二版