**:
在《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...