引入文件系统(二)

说明:本文中的内容,主要来自于WB. YANG的一本书,书名《writeos-1.0-2-weekly》,建议看原文,提供链接http://download.csdn.net/detail/mishifangxiangdefeng/5869801

 

一、    为什么要引入文件系统

 

突破启动扇区512字节的限制
对于512字节以后的内容,以文件的形式存入,可以很好地管理
具体做法:
(1)    使用某种文件系统对软盘格式化
(2)    给启动扇区的代码加上寻找文件的功能
(3)    加载执行文件
(4)    启动扇区将系统控制权移给软盘上的文件

二、    引入什么样的文件系统


本文实现的是FAT12文件系统
FAT文件系统存储结构如图所示:

QQ图片20140614201320
(1)    FAT1和FAT2,存储的是文件表项,每一项大小为12ibt,指向固定大小的文件“簇”。如果一个文件包含多个文件簇,表项的内容为文件的下一个簇号。
(2)    根目录,用于根据文件名查找文件的第一个簇。
(3)    数据区。
(4)    存储空间分配的单位是簇,一个簇可以包含一个或多个扇区。在本文中,一个簇包含一个扇区。

三、    怎样引入文件系统


所谓引入文件系统,就是具体做法中的第1步,即使用FAT12文件系统对软盘格式化。
所以,先看一下FAT12文件系统的“格式”:

QQ图片20140614201504

QQ图片20140614201540
这是一个称为BPB(BIOS Parameter Block)的数据结构。要把它填入到扇区0中,填对了,格式化的工作基本上完成了。
(1)    修改代码

/*start*/
.text
    jmp LABEL_START                /*Start to boot*/
    nop                            /*nop required*/

/*=========================================================================================
Name:FAT12 file system
Time:Chapter 2.2
Revision:2
Reason:启动扇区的大小限制为512字节,如果要加载的内容多于512字节,就加不进去了。因此要引入文件系统。让启动扇区将系统控制权转移给文件系统中的某个文件,突破512字节的限制
Method:软盘格式化的过程就是系统把文件系统信息写入到软盘上的过程。
MeMo:
    FAT文件系统的主要信息,都被提供在前几个扇区内,其中第 0 号扇区尤其重要。在这个扇区内隐藏着一个叫做BPB(BIOS Parameter Block)的数据结构,一旦我们把这个数据结构写对了,格式化过程也基本完成了
    以下内容就是对BPB数据结构初始化
=========================================================================================*/
/*Floppy header of FAT12*/
BS_OEMName:            .ascii    "windmiss"        /*OEM String, 8 bytes required*/
BPB_BytsPerSec:        .2byte    512                /*Bytes per sector*/
BPB_SecPerCluse:    .byte    1                /*Sector per clue*/
BPB_ResvdSecCnt:    .2byte    1                /*Reversed sector count*/
BPB_NumFATs:        .byte    2                /*Number of FATs*/
BPB_RootEntCnt:        .2byte    224                /*Root entries count*/
BPB_TotSec16:        .2byte    2880            /*Total sector number*/
BPB_Media:            .byte    0xf0            /*Media descriptor*/
BPB_FATSz16:        .2byte    9                /*FAT size(sectors)*/
BPB_SecPerTrk:        .2byte    18                /*Sector per track*/
BPB_NumHeads:        .2byte    2                /*Number of magnetic heads*/
BPB_HiddSec:        .4byte    0                /*Number of hidden sectors*/
BPB_TotSec32:        .4byte    0                /*If TotSec16 equal 0, this works*/
BS_DrvNum:            .byte    0                /*Driver number of interrupt 13*/
BS_Reserved1:        .byte    0                /*Reversed*/
BS_BootSig:            .byte    0x29            /*Boot signal*/
BS_VolID:            .4byte    0                /*Volume ID*/
BS_VolLab:            .ascii    "Solrex 0.01"    /*Volume label, 11 bytes required*/
BS_FileSysType:        .ascii    "FAT12   "        /*File system type, 8 bytes required*/

LABEL_START:
/*Initial registers, including ds, es, ss*/


(2)    Make。

makefile不用修改,make就可以了

对于这一点,我不太明白,make只是做了编译和链接,最后把可执行文件做成。Img,可是又没有执行可执行文件,为什么就起到效果了呢?

四、    效果

 

将未格式化的boot.img软盘用mount –o loop boot.img mountdir/挂载到目录上,系统会报错。
格式化以后,再mount,就可以成功。

现在把boot.img mount到linux上,就可以把其它的可执行文件放到boot.img中了

posted @ 2014-06-14 20:49  windmissing  阅读(319)  评论(0编辑  收藏  举报