作業系統學習初步-軟碟機介紹及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.分段式儲存和分頁式儲存,以及段頁式儲存的區別 分頁是一維儲存,分段是二維的 因為分頁給出虛擬位址後,作業系統會自動劃分頁號和偏移量 而分段給出位址後,需要知道段號和偏移量,段的長度是可變的!故是二維的 ...