引入文件系统(二)
说明:本文中的内容,主要来自于WB. YANG的一本书,书名《writeos-1.0-2-weekly》,建议看原文,提供链接http://download.csdn.net/detail/mishifangxiangdefeng/5869801
一、 为什么要引入文件系统
突破启动扇区512字节的限制
对于512字节以后的内容,以文件的形式存入,可以很好地管理
具体做法:
(1) 使用某种文件系统对软盘格式化
(2) 给启动扇区的代码加上寻找文件的功能
(3) 加载执行文件
(4) 启动扇区将系统控制权移给软盘上的文件
二、 引入什么样的文件系统
本文实现的是FAT12文件系统
FAT文件系统存储结构如图所示:
(1) FAT1和FAT2,存储的是文件表项,每一项大小为12ibt,指向固定大小的文件“簇”。如果一个文件包含多个文件簇,表项的内容为文件的下一个簇号。
(2) 根目录,用于根据文件名查找文件的第一个簇。
(3) 数据区。
(4) 存储空间分配的单位是簇,一个簇可以包含一个或多个扇区。在本文中,一个簇包含一个扇区。
三、 怎样引入文件系统
所谓引入文件系统,就是具体做法中的第1步,即使用FAT12文件系统对软盘格式化。
所以,先看一下FAT12文件系统的“格式”:
这是一个称为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中了