读写U盘(FAT32)引导扇区

参考:https://blog.csdn.net/zhanglei8893/article/details/5912903

看了《自己动手写操作系统》后,也想自己打造一个迷你操作系统,但是书中使用的软盘现在基本已经绝迹了,而U盘成为一种喜闻乐见的工具。因此想将操作系统写入U盘中,而读写U盘的引导扇区成为成功的关键。

将U盘格式化为FAT32文件系统,要读写U盘的引导扇区,需要首先了解FAT32的格式。它包含四个部分:

保留扇区 | FAT1 | FAT2 | 数据区。需要注意的是:保留扇区的第一个扇区是引导扇区(DBR)。

其中引导扇区的数据结构为:

数据区的开始为主目录区,主目录区包含了文件的熟悉,数据结构如下:

根据每个文件起始的簇号,就可以找到文件内容的绝对扇区起始位置

文件的簇号在FAT表中安装链表的形式存放,文件的属性在主目录区安装数组的形式存放。

文件内容的绝对扇区起始位置 = 保留扇区 + FAT1 + FAT2 + (起始簇号 -2)*每簇的扇区数

然后编写引导程序,读入U盘引导扇区,选择从U盘启动,就可以看到自己打造的U盘操作系统了

引导程序的汇编代码如下:

org 07c00h
jmp short LABEL_START
nop

OEM                   db  'Dirichet'            ;//8Bytes
Bytes_per_sector      dw   512
Sectors_per_cluster   db   8
Reserved_sectors      dw   584
Number_of_FATs        db   2
Root_entries          dw   0
Sectors_small         dw   0
Media_descriptor      db   0f8h
Sectors_per_FAT_small dw   0
Sectors_per_track     dw   63
Heads                 dw   255
Hidden_sectors        dd   63
Sectors               dd   3902913

Sectors_per_FAT       dd   3804
Extended_flags        dw   0
Version               dw   0
Root_dir_1st_cluster  dd   2
FSInfo_sector         dw   1
Backup_boot_sector    dw   6
times 12 db 0

BIOS_drive            db   80h
db 0
Ext_boot_signature    db   29h
Volume_serial_number  dd   15329558
Volume_label          db   'Dirichlet09'       ;//11个字节
File_system           db   'FAT32   '          ;//8个字节           

LABEL_START:
  mov  ax,cs
  mov  ds,ax 
  mov  es,ax
  call DispStr
  jmp  $

DispStr:
  mov ax,BootMessage
  mov bp,ax
  mov cx,15
  mov ax,01301h
  mov bx,000ch
  mov dl,0
  int 10h
 
  BootMessage:  db  'hello, kitty!', 13, 10, '$' 
  times 510-($-$$) db 0
  dw 0xaa55 
posted @ 2022-11-12 12:25  狂客  阅读(683)  评论(0编辑  收藏  举报