今天下午简直是噩梦啊~~~今天实验了loader的最后一项功能,也就是载入kernel并转交控制权,按照以前的方法编译(当然要注意书中讲的连接时注意制定位置到0x30400),也就是在cygwin下用nasm和ld进行。
问题出现了,当我用Virtual PC 5.2载入软盘镜像的时候,出现提示“出现随机的CPU错误,将重启”,而且更抽象的是,经过我多次试验发现,出现这个不知所云的错误的位置确实是“随机”的,有时候是显示完全部的内存信息之后,有时候才显示到第3行就重启了。难道是VPC的问题?换bochs,这下好了,无限刷屏重启~~~
郁闷的我开始怀疑所有可能出问题的地方:
1、源程序
本着娱乐至上的原则(自己⊙﹏⊙b汗一个),我扩充了彩色的提示信息,显得五颜六色的看着舒服,其他的源程序基本没有任何改动,主要是汇编程序设计还是不够熟练,要说完全自己写的话太费时间,目前先用一下书上的源程序以加快进度。难道是我加的那几句出错了?嘛,那就完全用作者的源程序,结果是~~~错误依旧。
2、编译连接的过程
由于编译连接有好几条指令,有可能是我搞错了什么,所以干脆用makefile完成好了,这个makefile也是书中光盘附带的,在cygwin下面也是可以用make 的,make之后,由于我不会让cygwin挂软盘,所以没有写入IMG文件,但是编译和连接的结果都出来了,再次试验,结果是~~~~错误依旧。
3、作者搞错了
我开始怀疑亲爱的作者,难道是他把源程序给错了?忽然发现光盘附带的程序中有做好的IMG镜像,试着载入,没有出现任何问题。这下我彻底石化了,也就是说,编译没问题,连接没问题,作者的程序也没问题,那,那有问题的是……
4、人品
人品,是一种看不见摸不着的东西……说笑了,到这里我基本上是无计可施了,这时,忽然想到最初有一次……
5、Cygwin的问题
那是刚装上Cygwin的时候,我迫不及待的实验了一下书上那个helloworld的程序,编译正确,但是到了执行的时候,却提示“permission denied”。爬google、爬手册爬了近2个小时没有结果,忽然灵光一闪,发现自己陷入了思维的误区。要知道,cygwin只是提供了类似linux的调用方法和使用体验,但是其本质还是windows平台的东西,那个helloworld的程序有linux的系统调用,而且windows应该也不认识elf格式,当然是没法执行的了。于是我爬了半天的努力化为浮云,后来在linux下执行了那个用cygwin编译的elf文件,果然,helloworld出现了。
这次的情况,应该和那次有所不同,因为我只是编译一下,而且也制定了elf文件格式了,又没有linux系统调用之类的东西,因为那个kernel就是我自己的操作系统用的。但是本着怀疑一切的debug无奈原则,我把源程序整到虚拟机中,用Ubuntu 9.04下的nasm和ld编译连接,命令完全没变,然后把结果拷回windows,copy到IMG镜像,载入,问题解决。
后来经过试验,出问题的就是kernel.asm的编译,在cygwin下出来的结果和虚拟机linux出来的结果不同(至少大小不同),而boot.asm和loader.asm都没有问题。具体到底为什么,本人才疏学浅,如果有哪位高人能指点一二,感激不尽。
最后给大家提个建议,这个cygwin是好东西,但是不能依赖它,它毕竟不是linux,甚至从本质上都不一样。哈哈,高手请无视我的碎碎念了……
脖子疼,赶紧休息去。
2009年8月8日18:16:13