看了《自己動手寫作業系統》後,也想自己打造乙個迷你作業系統,但是書中使用的軟盤現在基本已經絕跡了,而u盤成為一種喜聞樂見的工具。因此想將作業系統寫入u盤中,而讀寫u盤的引導扇區成為成功的關鍵。
將u盤格式化為fat32檔案系統,要讀寫u盤的引導扇區,需要首先了解fat32的格式。它包含四個部分:
保留扇區 | fat1 | fat2 | 資料區。需要注意的是:保留扇區的第乙個扇區是引導扇區(dbr)。
其中引導扇區的資料結構為:
資料區的開始為主目錄區,主目錄區包含了檔案的熟悉,資料結構如下:
根據每個檔案起始的簇號,就可以找到檔案內容的絕對扇區起始位置
檔案的簇號在fat表中安裝鍊錶的形式存放,檔案的屬性在主目錄區安裝陣列的形式存放。
檔案內容的絕對扇區起始位置 = 保留扇區 + fat1 + fat2 + (起始簇號 -2)*每簇的扇區數
然後編寫引導程式,讀入u盤引導扇區,選擇從u盤啟動,就可以看到自己打造的u盤作業系統了
引導程式的彙編**如下:
[c-sharp]view plain
copy
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
linux下FAT32格式u盤唯讀的問題及解決方法
以下是網上看到的解決辦法 plain view plain copy 其實是掉電保護,之前掛在的sd變成了制度檔案,只需要將sd卡重新掛載一遍就ok了.fat filesystem panic dev mmcblk0p4 fat free clusters deleting fat entry be...
Other U盤FAT32轉NTFS且無資料丟失
序 做了乙個u盤啟動盤後發現檔案系統格式為fat32。這種格式支援單個檔案最大4g,超過4g就無法拷貝了。為了防止以後突發情況所以提前把fat32轉換成ntfs。為避免匯入匯出資料最簡單的方法利用dos命令轉換。速度快且原始檔不丟失。步驟 開始 執行 cmd 以管理員身份執行cmd 輸入 conve...
FAT32的協議總結
讀了fat32協議等,做了一些工作,學會不少東西,但是也有很多不懂得地方,希望明白人多來指教。在u盤進行fat32格式化後,發現除了mbr,dbr,data資料區外,還有一些資料區。就是用winhex發現的,有些資料段都沒見過,不知道是幹什麼的。就是那兩個unpartitioned space。fa...