自制操作系统(六)

今天来解决一下历史遗留问题。
首先,文件名全部按照小写字母表示,用C语言写的,为什么不用C++?那是因为C++有可能在编译过程中将main函数改名,这个很难办。
然后,尽可能的套娃,这样include进去的也少。即便有测试的,也要用一个test函数解决问题。
这个文件的组织也是一个大问题。。。参考Linux,我是这么组织文件的。
document // 源码解释文档文件夹
video // 显示相关文件夹
audio // 声音相关文件夹
file     // 文件相关文件夹
system//进程相关,中断相关文件夹
internet//网络相关文件夹
lib // 一些自己编写的实用函数文件夹
main.c
现在,编译的是基本的二进制代码,装载软盘里,这个是很明显的事情,但是有一点是,这个中断并没有成功实现,中断不能实现,那么我就不能实现鼠标和键盘,那些定义的一堆东西就没有用,我的一个解决方法是,把它装到U盘中,然后开机启动,但是软盘驱动就这么难做了,更何况U盘驱动呢?在网上找了半天,也没有讲U盘驱动的,那么今天讲讲U盘启动吧。
实际上,BIOS是可以让你自己去挑选这个哪个硬盘启动的(物理硬盘),然后BIOS会检查这个硬盘的头512字节的末尾是不是55aa,如果是,它就会默认为这是一个驱动程序,然后将PC移动到这里,开始执行这段程序了。

但是你知道,所有程序的运行,必须保证程序是在内存里的,而不是在磁盘里的,因此BIOS实际做的是,将这个512字节先读到内存里,那么读到内存哪里呢?

这就知道,BIOS本身也是占用内存的,它大概占用内存的前1MB大小的字节,硬盘的前512字节也是被读到这里,也就是说,虽然执行到驱动程序,这所有内存就能为我所用了(实际上还是有一些不能,以后讲),但是我现在还是在BIOS的内存中,我自然不能在BIOS的内存中,这时候我需要将硬盘上的其他系统代码拷贝到内存中,一般就是从BIOS占用的头1MB开始往后加到内存中,拷贝完毕就直接蹦到这些系统代码中,然后这些代码就开始进行运作,例如给内存分段分块,启动中断什么的,就真正可用了。

那么头1MB,也就是BIOS占用的1MB现在有什么用呢?原则上说来,没什么用 了,那1MB就已经空闲了。但是指不定什么时候系统瓦特掉了这时候能返回BIOS也是挺不错的,所以那1MB就不要动了。

好,那么我们现在的任务就是往硬盘的头512个字节里写入一些能够显示的东西,然后让它显示什么东西。

慢着,这里有一个问题,它是32位的还是64位的?

实际上,在BIOS中,它运行的是实模式,也就是16位的,然后,我们需要手动切换成32位的,或者是64位的,都可以。现在鉴于64位的电脑大多都是,因此切换成64位也没什么关系。

所以说,最好编一个软件,它直接修改U盘的启动区,然后把该系统写进去,对于U盘还是软盘来说,它的系统部分应该是一样的,因此并不用修改就可以了,调试的时候用软盘的即可。

对于在U盘上启动的系统,它的后缀名应该是ISO,在软盘上启动的系统,它的后缀名是IMG,对于网上的来说,他们大多数都是在U盘上模拟了软盘环境,实际上操作系统还是IMG的,但是这样还不如在软盘上弄呢,没意义。

实际上,对于读U盘,其格式还是跟读软盘一样的,符合CHS格式,但是我们就不知道它的格式是怎么样的了,因此我们需要一个中断来确定其格式,因此代码还是差不多一样的,嗯。

既然知道了是怎么回事,反而不用做了,只不过现在做不了中断而已,如果我能跑通30天自制操作系统的代码,那么我就可以知道是怎么回事。

说实话,你最好先弄一个32位的windows,剩下的才好说。

原来要从第二天开始。。。在64位下的确还是不行。。。搭建xp看来是对的。










 

发布了147 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/HeroIsUseless/article/details/104136388
今日推荐