操作系统开发者的新手经常会遇到一个问题,那就是怎样建立ima文件(即软盘映像,也可能是img格式的)。曾经我也在这个问题山浪费了很多不必要的时间。现在我将解决方法写出来,希望可以让大家快速的解决这个困难。
实际上,ima文件(或img)就是严格按照软盘的格式来的。而软盘的数据组织格式就是FAT12文件系统。也就是说,我们要读文件就是按照FAT12文件系统的规则来读!而不要按照扇区来读!因为winimage(代指类似的创建软盘映像的工具)就是按照FAT12文件系统的规则来写入的!如果我们用winimage来建立ima文件,而通过扇区的方式来读文件当然会出错!
解决的方法有两个:
一、按照winimage来建立ima文件,并用winimage来把我们的文件写入映像,然后用FAT12的规则来读文件。(FAT12文件系统的读写方法足以写一篇文章,我会在以后单独通过一篇文章来研究这个问题.)
二、按照我们自己的方式来建立ima文件,并按照扇区的方式写入我们的文件,然后按照扇区的方式来读我们的文件。
其中第一种方法,兼容性很好。因为无论是dos还是windows还是linux都可以认识它,并读写它。但是我们在程序里面读取的时候却要费些劲。这里面主要的难度是读写FAT12系统。
而第二种方法,非常的简单。对于刚刚入门的新手非常适合。但是有一点就是现有的工具很少.事实上,实现起来非常的简单.下面我就在这个方面做一下介绍。
1、创建ima文件:
这一步很简单,你可以用任何一个创建ima文件的工具创建。也可以自己编写程序创建。时间上你只要写1.44MB个0的二进制文件就可以了(我是说在我们这种情况下)!
2、写入引导程序和我们的操作系统文件(包括内核等文件)
这一步也很简单,但是没有现成的工具来完成。其原理是:把引导程序写到前面创建ima文件前512个字节里面去。把我们的操作系统文件也写入相应的位置。为什么说是相应的位置?怎样计算这个相应位置呢?因为每个人都会把操作系统的文件写入不同的扇区,比如有些人希望写入以第三个扇区开头的两个扇区里。而另一些人可能会写到别的地方去。但是无论怎么我们都是可以计算出它在ima文件里面的绝对位置的,即它是从第几个字节开始,到第几个字节结束的。
Byte=512 *(Track * n + Sector)
其中:
Track:代表要写入位置的起始磁道号
n:代表每个磁道包含的扇区数
Sector:代表要写入位置的起始扇区号
Byte:代表这个文件在ima文件中的开始位置
这样我们就可以知道我们的操作系统文件到底在ima要写到什么地方。现在,我们要做的就是把我们的操作系统文件写到相应的位置就是了。写入方法很简单,就是读写二进制文件。我想这个大家都会,不会的话找一下C语言中文件读写部分的内容看一下。
实际上,ima文件(或img)就是严格按照软盘的格式来的。而软盘的数据组织格式就是FAT12文件系统。也就是说,我们要读文件就是按照FAT12文件系统的规则来读!而不要按照扇区来读!因为winimage(代指类似的创建软盘映像的工具)就是按照FAT12文件系统的规则来写入的!如果我们用winimage来建立ima文件,而通过扇区的方式来读文件当然会出错!
解决的方法有两个:
一、按照winimage来建立ima文件,并用winimage来把我们的文件写入映像,然后用FAT12的规则来读文件。(FAT12文件系统的读写方法足以写一篇文章,我会在以后单独通过一篇文章来研究这个问题.)
二、按照我们自己的方式来建立ima文件,并按照扇区的方式写入我们的文件,然后按照扇区的方式来读我们的文件。
其中第一种方法,兼容性很好。因为无论是dos还是windows还是linux都可以认识它,并读写它。但是我们在程序里面读取的时候却要费些劲。这里面主要的难度是读写FAT12系统。
而第二种方法,非常的简单。对于刚刚入门的新手非常适合。但是有一点就是现有的工具很少.事实上,实现起来非常的简单.下面我就在这个方面做一下介绍。
1、创建ima文件:
这一步很简单,你可以用任何一个创建ima文件的工具创建。也可以自己编写程序创建。时间上你只要写1.44MB个0的二进制文件就可以了(我是说在我们这种情况下)!
2、写入引导程序和我们的操作系统文件(包括内核等文件)
这一步也很简单,但是没有现成的工具来完成。其原理是:把引导程序写到前面创建ima文件前512个字节里面去。把我们的操作系统文件也写入相应的位置。为什么说是相应的位置?怎样计算这个相应位置呢?因为每个人都会把操作系统的文件写入不同的扇区,比如有些人希望写入以第三个扇区开头的两个扇区里。而另一些人可能会写到别的地方去。但是无论怎么我们都是可以计算出它在ima文件里面的绝对位置的,即它是从第几个字节开始,到第几个字节结束的。
Byte=512 *(Track * n + Sector)
其中:
Track:代表要写入位置的起始磁道号
n:代表每个磁道包含的扇区数
Sector:代表要写入位置的起始扇区号
Byte:代表这个文件在ima文件中的开始位置
这样我们就可以知道我们的操作系统文件到底在ima要写到什么地方。现在,我们要做的就是把我们的操作系统文件写到相应的位置就是了。写入方法很简单,就是读写二进制文件。我想这个大家都会,不会的话找一下C语言中文件读写部分的内容看一下。
3、在我们的操作系统中读ima中的操作系统文件
这样一来,我们的引导程序在加载这些文件的时候也就简单了。我们只需要调用BIOS提供的中断读对应的扇区就可以了。
不过还有一点需要注意的就是,我们的程序最好是扇区对齐的。也就是说我们的程序最好是512字节的整数倍,当然不是512个字节的整数倍也没有关系,因为我们前面创建文件的时候是全部填充的0。但是在其他情况下可能会出错。例如,你是使用的其他工具进行建立的或者是修改原来的ima映像。解决的方法也有两个,一个就是我前面说的让程序的大小扇区对齐,另一个就是在写入的时候将最后一个扇区中写文件剩余的该扇区空间填充为0。
但是,我们应该注意的是这中方法只是新手入门是的解决方案。在你逐渐熟悉了文件系统技术,能够方便的通过编程的方式读写FAT分区的时候,你就应该改成使用第一种方法。毕竟这种方法在兼容性上更好一些。编辑ima文件的时候也容易一些。扩展性也要更好一些.