1.什么是MBR
說實話,我一直都不喜歡在一大堆內容一開始就拋出一長條概念,這很勸退,但現在記錄一下是很有必要的,否則后續忘記就難理解了,
簡單來講,MBR記錄著硬碟各個磁區的大小和位置資訊,就像人口普查一樣,對整個硬碟的分布了熟于心,它是開機后訪問硬碟時要讀取的第一個扇區,不難理解,畢竟要知道自己去哪得先看地圖,噢,對了,它的全稱是主引導記錄(master boot record),由于os需要一步步進行權限的完善,有程式進行接力和指引是必須的事情,
2. 0x7c00?why?
好吧,這個問題我也一直都很好奇,在進行6.s081實驗時,取斷點并跳轉總是從0x7c00開始,搜了很多作業系統有關的文章都沒有給我一個滿意的答案,現在算是知道了:
早期的CPU要求物理地址 0x0~0x3FF 存放中斷向量表(我還不知道這是什么意思),所以只能找其他地方放MBR了,在那時DOS(古老的系統)要求最小記憶體是32KB,但是MBR自然不可能覆寫在前面或中間(不然其他功能去哪開始加載,無序會導致混亂和時間變長),所以它必須預留空間,所以就得在32KB的末尾,
寫程式的大家都知道,程式必須要用到堆疊,MBR雖說是匯編語言但也是一段程式,它在記憶體里由于要給堆疊分配空間實際上總空間要大于512位元組,最大估計也就1KB了(畢竟功能就那點),所以選32KB中最后1KB最合適,而那個地方就是0x7c00,
3.啟動MBR的坎坷風雪路
首先是簡單的MBR代碼:
1 ;主引導程式 2 ;--------------------- 3 4 SECTION MBR vstart=0x7c00 ;程式開始的地址 5 mov ax, cs ;使用cs初始化其他的暫存器 6 mov ds, ax ;因為是通過jmp 0:0x7c00到的MBR開始地址 7 mov es, ax ;所以此時的cs為0,也就是用0初始化其他暫存器 8 mov ss, ax ;此類的暫存器不同通過立即數賦值,采用ax中轉 9 mov fs, ax 10 mov sp, 0x7c00 ;初始化堆疊指標 11 12 ;清屏利用0x10中斷的0x6號功能 13 ;------------------------ 14 mov ax, 0x600 15 mov bx, 0x700 16 mov cx, 0 17 mov dx, 0x184f 18 19 int 0x10 20 ;獲取游標位置 21 ;--------------------- 22 mov ah, 3 ; 3號子功能獲取游標位置 23 mov bh, 1 ; bh暫存器存盤帶獲取游標位置的頁號,從0開始,此處填1可以看成將游標移動到最開始 24 int 0x10 25 26 ;列印字串 27 ;------------------ 28 mov ax, message 29 mov bp, ax 30 31 mov cx, 6 ;字串長度,不包括'\0' 32 mov ax, 0x1301 33 mov bx, 0x2 34 35 int 0x10 36 37 jmp $ 38 39 message db "My MBR" 40 times 510-($-$$) db 0 41 db 0x55, 0xaa
注釋都說的很清楚,顯示幕相關就不提了,主要寫寫第24行0x10中斷和37、40、41行,
0x10中斷在這里負責有關列印的例程,呼叫方法是將功能號送入ah暫存器,其他引數按照中斷要求放在適當暫存器,然后執行int 0x10,具體了解在這貼個鏈接:(3條訊息) BIOS INT 10中斷功能詳解_bios顯示模式 int10_rhxznp的博客-CSDN博客
37行是一個死回圈,$是本行指令的地址,jmp是近跳轉,那么jmp $就是跳到自己的地址再執行自己,再跳到自己的地址再跳轉,這樣是為了讓程式懸停在此處,等待下一步,
40行的$$是本section的起始地址,和上面$區別還是很大的,section起始地址和行起始地址并不是一個東西,$-$$是本行到本section的偏移量,MBR的最后兩個位元組必須是固定的內容,也就是BIOS認為可執行的程式MBR啦!如果不是,OK,BIOS不認識,無法啟動,
那么一串times 和 - 號、db是什么意思?因為要預留出0x55,0xaa,所以得要計算填滿扇區用的位元組數,MBR共有512位元組,那么510個位元組就得填充,但是扇區里還有其他東西加載,所以用510-($-$$)得到剩余量,然后用0填充,這樣預留的兩位元組就能確保了,
也就是說,到這里程式加載的順序是BIOS -> 跳轉0x7c00 -> 跳轉0x55,0xaa.
接下來是最艱難的啟動之路!
利用dd和nasm分別寫入和編譯MBR,這個沒問題,注意路徑就行,主要是啟動bochs時,錯誤主要有三個(反反復復!):
這個每次啟動都會彈出,真的很雞肋!通過查閱發現img.lock洗掉后重啟就行,還是不行命令加個sudo也可以,
- sector size of 0 is in error. 措施:中文意思是扇區大小0出錯,我懷疑是我硬碟沒有建立,或者建立了系統沒反應,所以重新又建立了一次,解決了問題,
- NO bootable device. 措施:一開始我很困惑,明明我dd也nasm了怎么不認呢?原來是第二個錯誤的連鎖反應,建立硬碟后再dd nasm一次就能識別MBR了,
雖說就三個錯誤,折騰了我大半天時間,一些文章也沒有我的錯誤,反反復復重啟洗掉,最后終于出現在bochs的圖讓我成就感滿滿,附個勝利圖:

呃,別問我為什么和上面的程式顯示不一樣,為了解釋重點的MBR結構,我搜索了這個比較簡單的程式,但圖中的這個是《作業系統真象還原》里的完整代碼運行出的結果,所以不一樣,
OK!總算是寫完初認識啦!我只是個小菜雞,一些認識肯定是淺顯或有些不準確的,后面會隨著OS的完善逐步深入,感謝瀏覽!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/556498.html
標籤:其他
下一篇:返回列表
