看了《自己动手写操作系统》后,也想自己打造一个迷你操作系统,但是书中使用的软盘现在基本已经绝迹了,而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