關於INT13H函式對U盤的讀寫

2021-08-10 22:16:44 字數 2225 閱讀 7642

**:

在《30天自製作業系統》中,作者使用軟盤作為作業系統儲存介質進行作業系統的編寫講解。但目前計算機裝置都已基本放棄軟盤支援,雖然依然可以在虛擬機器上進行模擬練習,始終還是希望有乙個可以真正能在物理裝置上驅動安裝的系統。

目前常用的移動介質基本都是u盤,所以我開始嘗試用u盤開始學習。但在進行儲存讀寫時,就出現了問題。因為u盤的儲存結構和軟盤是有區別的。而且,現在多數都使用fat32格式,那麼對於mbr中bpb(bios parameter block)的結構也存在差異。

目前對於磁碟的讀寫有2種方式,一種是chs定址模式,一種是lba定址模式。chs方式更多的是基於最初的磁碟結構,就是柱面+磁頭+扇區的讀寫方式。書中作者對軟盤的讀寫就是採用的這種方式。lba是一種基於邏輯位址塊的定址模式。這種模式隱藏了儲存器底層的一些細節,比如對於柱面、磁頭、扇區等的了解。因而也是一種更為通用的磁碟讀寫模式。雖然chs和lba的定址基本單位都是扇區,但chs需要3個引數同時確定乙個扇區,而lba將所有的扇區進行邏輯上的線性排列,從而能夠進行線性查詢。

bois中的int13h函式支援這兩種定址模式。

在查詢資料的過程中,我沒有查詢到利用int13h函式用chs模式對u盤進行讀寫的示例,因為我也是初學者,對於這方面的知識也不全面,所以,我也不確定在chs模式是否可以。但lba模式是一定可以的。

lba模式在讀寫硬碟上雖然較為chs模式簡單,因為它是線性定址的。但在int13h函式中,需要提前設定乙個位址資料結構,用於儲存一些讀取資訊,比如讀取的記憶體位址、扇區數、其實lba塊等。該資料結構的構成格式如下:

偏移(位元組)

大小(位元組)說明0

1該資料結構的大小,通常為16位元組11

通常為0,意義不明22

傳輸的扇區數(在某些bios中最大為127)。44

84起始lba塊124

用於對大容量儲存裝置的讀取

該模式下的int13h呼叫過程:

l  首先在磁碟位址資料結構體中設定正確的值。

l  設定ds:si位址資料結構在記憶體中的位址

l  讀出資料到記憶體:ah=0x42,寫入記憶體資料到磁碟ah=0x43

l  dl=驅動器編號

l  呼叫int    0x13

在讀取的過程中出現錯誤的話,進製標誌(carry flag)會被置1。執行成功的話,ah置0。

例項:[plain]

view plain

copy

entry:  

mov     ax,cs   ;初始化暫存器  

mov ds,ax  

mov ds,ax  

mov es,ax  

mov ah,0x42  

mov dl,0x80  

mov si,packet  

int     0x13  

jc  error  

;將寫入的記憶體位址後移512位元組  

;以下是將位址資料結構中的起始lba後移1塊繼續寫入下乙個扇區  

;將packet的記憶體偏移512位元組  

mov ax,[bufferoff]  

mov bx,bufferoff  

add ax,0x0200  

mov [bx],ax  

;將起始lba加1,以讀取下乙個扇區  

mov ax,[blocknum]  

mov bx,blocknum  

add ax,1  

mov [bx],ax  

cmp ax,5    ;連續讀取4個扇區  

je  finish  

jmp entry  

;位址資料結構體  

packet:  

packet_size:     db 10h             ;packet大小,16個位元組  

reserved:    db     0  

count:       dw 1       ;讀1個扇區  

bufferoff:       dw 0x0820          ;讀到記憶體0x0820處,偏移位址  

bufferseg:   dw 0       ;段位址  

blocknum:    dd 1               ;起始lba塊  

dd     0  

error:  

finish:  

對於以上程式,也可以在packet的count中一次性設定需要寫入的扇區數。但為了測試連續寫入,所以我每次只寫入乙個扇區。

詳細的可參見:

關於庫函式的宣告 h

庫函式也需要宣告 對於庫函式的宣告,c語言程式是通過 系統標頭檔案 進行的 include這就是關於printf 函式 scanf 函式等函式的宣告。include的本質是 將 x.h的全部內容 c程式 複製乙份,代替 include 即,x.h的內容與我們所編寫的源 內容,合併編譯生成最終的可執行...

函式模板案例之對char和int型別陣列排序

filename 3 函式模板案例 對char和int型別陣列排序 author young fan date 2018.4.30 ide visual studio 2017 description 函式模板案例 對char和int型別陣列排序 includeusing namespace std...

2018 9 14 關於對JS函式的理解的總結

分割線 首先在使用函式的時候要了解函式的三要素 1.首先先用注釋說明函式的需求 2.然後在函式中寫明要傳的引數 3.最後寫清楚返回值 js函式可分為 無引數無返回值 有引數有返回值 有引數無返回值 無引數有返回值 關於返回值問題 如果return 後面跟內容了,就返回return後面的內容 如果re...