作業系統學習初步 軟碟機介紹及BIOS呼叫示例

2021-08-28 11:37:21 字數 3664 閱讀 1076

作業系統學習初步-軟碟機介紹及bios呼叫示例

軟碟機

1.4m的軟盤兩面均可記錄資訊,稱為面0和麵1。兩面各有乙個磁頭可以記錄和讀取資訊,兩個磁頭分別稱為磁頭0和磁頭1。每面有80個同心圓磁軌,從外向裡稱為磁軌0…磁軌79 。每個片面均分成18個扇面。扇面把磁軌分成了更小的單元,每一小塊稱為乙個扇區,乙個扇區是512位元組,面0磁軌0有18個扇區,序號1…18,面1磁軌0為19…36,然後磁軌1開始排序。全盤容量為 5121880*2=1474560位元組。

磁碟中斷:int 0x13

ah 0x0重置;0x2讀盤;0x3寫盤;0x4校驗;0x5尋道

al 讀取物件佔的扇區數(只能同時處理連續的扇區,意思是不能跨越磁軌、磁頭)

es:bx 讀出的資料儲存在什麼地方?

ch 磁軌號(柱面號)

cl 從第幾個扇區開始讀

dh 磁頭號(0或1)

dl 驅動器號,一般情形軟碟機是a盤,為0

flags.cf 0,正確,ah == 0;1,錯誤,ah == 錯誤碼

以下是一段讀取軟碟機內容到指定物理記憶體的彙編**。

該程式只能讀取一張軟盤。

程式引數:驅動器號,一般為0;需要讀取的位置(指定內容在磁碟中的偏移,不是哪個扇區);讀取內容的位元組數;目標物理記憶體。

本段程式為gnu as,at&t語法格式。需要注意的是識別符號大小寫敏感的。

.macro floppyread  driver,readposition,readsize,dest

jmp _floppyreadentry

_floppy_vars:

# 變數

head :.byte 0 #磁頭號

cylinder :.byte 0 #柱面號

sector :.byte 1 #扇區號

once :.byte 1 #一次連續讀取的扇區數

sectors :.word 1 #需要讀取的扇區數目

phyaddr:.long \dest

okay :.ascii "read success!"

_floppyreadentry:

# 求讀取位置所在柱面扇區磁頭資訊

movl $\readposition,%eax #讀取位置/512獲得扇區數目

movl $512,%ecx

xorl %edx,%edx # 真的要小心,這條指令不能少,不然結果不確定。edx=0

divl %ecx

addl $1,%eax #餘數為0時,讀取位置還是要定位到下一扇區,譬如512,第一扇區為0..511,512 in sector2

get_head:

movl $36,%ecx # 正反2面共36個簇

xorl %edx,%edx # edx清0

divl %ecx

movb %al,cylinder

cmp $18,%edx # 餘數為扇區數》18,磁頭為1,扇區為(餘數-18)

jna get_sector

subl $18,%edx

movb $1,head

get_sector:

movb %dl,sector

# 求取需要讀取的扇區數

movl $\readsize,%eax

xorl %edx,%edx

movl $512,%ecx

divl %ecx

addl $1,%eax

movw %ax,sectors

# 把 si作為計數器,統計已經讀取的扇區

movw $0,%si

_retry:

# 求一次讀入的扇區數

movb $19,%al

subb sector,%al

movb %al,once

# 把將要讀取的扇區數加已經讀完的扇區數相加和總數比較

movw %si,%bx

addb once,%bl

cmpw sectors,%bx

# 如果%bx<=sectors,直接進行讀取

jbe _callbios

# 如果超過了,把once減去超過的數量,得到需要讀取的數量

movw once ,%ax

subw sectors,%bx # 得到多餘的數量 21-4=17

subw %bx,%ax

movb %al,once

_callbios:

movw $0,%ax

movw %ax,%es

movw phyaddr,%bx

movb head,%dh #磁頭

movb $\driver,%dl #驅動器

movb cylinder,%ch #柱面

movb sector,%cl #扇區

movb $0x02,%ah

movb once,%al #讀入扇區數量

int 0x13

nopjc _callbios

_next:

add once,%si

cmp sectors,%si

#如果大於等於需要讀取的扇區數,跳轉到結束

jae _read_finish

_go_on:

# 將寫入位址修改

movl $512,%eax

mull once

addl phyaddr,%eax

movl %eax,phyaddr

# 起始扇區重置1

#movb $1,sector

# 更換磁頭

movb head,%al

not %al

and $1,%al

movb %al,head

#如果磁頭由1->0,磁軌加1

cmp $0,%al

jne _retry

add $1,cylinder #如果cylinder>80,則需要更換磁碟

jmp _retry

_read_finish:

nopmovw $okay,%bp /* es:bp=字串位址 */

movw $13,%cx /*字串長度 */

作業系統學習

看了幾天的資料,今天終於有時間把測試環境搭建起來。模擬機bochs nasm ultraiso 模擬機bochs的設定不難,在網上搜了些資料和參考了bochs的說明檔案,基本上就可以組建並執行起來。在網上下了個dos的映象,執行bochs從a盤啟動,之後把硬碟分割槽格式化,乙個最基礎的測試環境就完成...

作業系統學習

1 處理器硬體故障中斷事件 由處理器,記憶體儲器,匯流排等故障引起 程式性中斷事件 2 處理器執行機器指令引起 1.1 除數為零,運算元溢位等算術異常 1.3 終止程序指令 終止程序 3 自願性中斷事件 1.1 處理器執行陷入指令請求os服務引起 1.2 請求分配外設,請求io等 1.3 處理流程是...

作業系統學習筆記

這裡專門摘錄作業系統相關筆試題和面試題!也當作自己的乙個複習!乙個很全的作業系統常考知識集合 1.分段式儲存和分頁式儲存,以及段頁式儲存的區別 分頁是一維儲存,分段是二維的 因為分頁給出虛擬位址後,作業系統會自動劃分頁號和偏移量 而分段給出位址後,需要知道段號和偏移量,段的長度是可變的!故是二維的 ...