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