FAT12 学习.

    技术2022-05-11  79

    1、引导扇区的识别:

     org  07c00h

    jmp short LABEL_START  ; Start to boot. nop    ; 这个 nop 不可少

     ; 下面是 FAT12 磁盘的头 BS_OEMName DB 'ForrestY' ; OEM String, 必须 8 个字节 BPB_BytsPerSec DW 512  ; 每扇区字节数 BPB_SecPerClus DB 1  ; 每簇多少扇区 BPB_RsvdSecCnt DW 1  ; Boot 记录占用多少扇区 BPB_NumFATs DB 2  ; 共有多少 FAT 表 BPB_RootEntCnt DW 224  ; 根目录文件数最大值 BPB_TotSec16 DW 2880  ; 逻辑扇区总数 BPB_Media DB 0xF0  ; 媒体描述符 BPB_FATSz16 DW 9  ; 每FAT扇区数 BPB_SecPerTrk DW 18  ; 每磁道扇区数 BPB_NumHeads DW 2  ; 磁头数(面数) BPB_HiddSec DD 0  ; 隐藏扇区数 BPB_TotSec32 DD 0  ; 如果 wTotalSectorCount 是 0 由这个值记录扇区数 BS_DrvNum DB 0  ; 中断 13 的驱动器号 BS_Reserved1 DB 0  ; 未使用 BS_BootSig DB 29h  ; 扩展引导标记 (29h) BS_VolID DD 0  ; 卷序列号 BS_VolLab DB 'Tinix0.01  '; 卷标, 必须 11 个字节 BS_FileSysType DB 'FAT12   ' ; 文件系统类型, 必须 8个字节 

    LABEL_START:  mov ax, cs mov ds, ax mov es, ax Call DispStr   ; 调用显示字符串例程 jmp $   ; 无限循环DispStr: mov ax, BootMessage mov bp, ax   ; ES:BP = 串地址 mov cx, 16   ; CX = 串长度 mov ax, 01301h  ; AH = 13,  AL = 01h mov bx, 000ch  ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮) mov dl, 0 int 10h   ; int 10h retBootMessage:  db "Hello, OS world!"times  510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节dw  0xaa55    ; 结束标志 

     

    2、.img文件用UltraEdit文件查看。向里面写boot.bin文件内容时,就把FAT12的标识写到前512

    在1fe 处有“55AA”结束标记

    3、但boot.bin写入成功后,用虚拟机打开。可以向里面写入文件与目录。 

      目录与文件一样。占用一个簇。这个簇的内容为目录内文件的簇位置。

      一个簇是一个FATentry 有12B组成。

     FFF为结束标志    FF 0F  F0 FF 都可能成为文件只占用一个簇的内容。但是如果一个文件占用几个簇。

    那就由簇的内容决定下一个簇的位置。。00 F1 FF 这些内容用软件看一下就明白许多了。  

    4、RootDirSectors=((BPB_RootEntCnt * 32 )/ BPB_BytsPerSec    224 * 32 /512 =14

         根目录区开始与数据区就要开始计算了。  如第2簇的内容为 (19+14)* 512 = 16896 (0x4200)

       第3簇内容就在(20+14)*512 = 17408 (0x4400) 如果有变化。就得变14 其它还在研究中。。

     

    补充中。。。。


    最新回复(0)