主引導記錄MBR 作業系統真相還原

2021-08-20 07:32:17 字數 4511 閱讀 1148

section mbr vstart=0x7c00  

mov ax,cs

mov ds,ax

mov es,ax

mov ss,ax

mov fs,ax

mov sp,0x7c00

mov ax,0x600

mov bx,0x700

mov cx,0

mov dx,0x184f

int 0x10

mov ah,3

mov bh,0

int 0x10

mov ax,message

mov bp,ax

mov cx,5

mov ax,0x1301

mov bx,0x2

int 0x10

jmp $

message db "1 mbr"

times 510-($-$$) db 0

db 0x55,0xaa

這段**的功能就是列印」1 mbr「在螢幕上。分為初始化特殊暫存器和棧指標,清除螢幕,獲取游標位置,列印字串,填滿mbr佔的512b剩餘空間

nasm -o mbr.bin, mbr.s

將編譯生成的mbr.bin寫入磁碟 

dd if=mbr.bin of=../hd60m.img bs=512 count=1 conv=notrunc

bochs -f bochsrc.disk

正常情況下,在控制台輸入字元c後,會在顯示器上顯示 1 mbr資訊。

但是遺憾的是,會有很大可能遇到 message: ata0-0: could

notopen hard driveimagefile hd60m.img 錯誤

解決方法,修改bochsrc.disk 配置檔案 

ata0-master: type=disk, path="/usr/local/bochs/hd60m.img", mode=flat, cylinders=121, heads=16, spt=63, translation=auto

增加了translate引數即可

section mbr vstart=0x7c00  

mov ax,cs

mov ds,ax

mov es,ax

mov ss,ax

mov fs,ax

mov sp,0x7c00

mov ax,0xb800

mov gs,ax

mov ax,0x600

mov bx,0x700

mov cx,0

mov dx,0x184f

int 0x10

mov byte [gs:0x00],'1'

mov byte [gs:0x01],0xa4

mov byte [gs:0x02],''

mov byte [gs:0x03],0xa4

mov byte [gs:0x04],'m'

mov byte [gs:0x05],0xa4

mov byte [gs:0x06],'b'

mov byte [gs:0x07],0xa4

mov byte [gs:0x08],'r'

mov byte [gs:0x09],0xa4

jmp $

times 510-($-$$) db 0

db 0x55,0xaa

該段**通過直接往記憶體空間 0xb8000 - 0xb8009處寫入字元『1 mbr』,這一段記憶體空間被位址匯流排對映到顯示卡的視訊記憶體

boot.inc 檔案定義了一些boot配置,在這裡定義了兩個巨集loader_base_addr, loader_start_sector, 分別表示載入進記憶體的起始位址和從硬碟讀取資料的起始扇區

%include "boot.inc"  

section mbr vstart=0x7c00

mov ax,cs

mov ds,ax

mov es,ax

mov ss,ax

mov fs,ax

mov sp,0x7c00

mov ax,0xb800

mov gs,ax

mov ax,0x600

mov bx,0x700

mov cx,0

mov dx,0x184f

int 0x10

mov byte [gs:0x00],'1'

mov byte [gs:0x01],0xa4

mov byte [gs:0x02],''

mov byte [gs:0x03],0xa4

mov byte [gs:0x04],'m'

mov byte [gs:0x05],0xa4

mov byte [gs:0x06],'b'

mov byte [gs:0x07],0xa4

mov byte [gs:0x08],'r'

mov byte [gs:0x09],0xa4

mov eax,loader_start_sector

mov bx,loader_base_addr

mov cx,1

call rd_disk_m_16

jmp loader_base_addr

rd_disk_m_16:

mov esi,eax

mov di,cx

mov dx,0x1f2

mov al,cl

out dx,al

mov eax,esi

mov dx,0x1f3

out dx,al

mov cl,8

shr eax,cl

mov dx,0x1f4

out dx,al

shr eax,cl

mov dx,0x1f5

out dx,al

shr eax,cl

and al,0x0f

out dx,al

shr eax,cl

mov dx,0x1f5

out dx,al

shr eax,cl

and al,0x0f

or al,0xe0

mov dx,0x1f6

out dx,al

mov dx,0x1f7

mov al,0x20

out dx,al

not_ready:

nop

in al,dx

and al,0x88

cmp al,0x08

jnz not_ready

mov ax,di

mov dx,256

mul dx

mov cx,ax

mov dx,0x1f0

go_on_read:

in ax,dx

mov [bx],ax

add bx,2

loop go_on_read

ret

times 510-($-$$) db 0

db 0x55,0xaa

上面這段**,通過寫硬碟控制器埠先告訴硬碟控制器,要讀取多少個扇區,讀起始扇區位址,等待硬碟控制器準備好資料,最後從loader的儲存位置讀取loader程式載入進記憶體,並跳轉到loader處開始執行,將接力棒交接給核心載入器

boot.inc的內容

loader_base_addr equ 0x900  

loader_start_sector equ 0x2

下面是loader.s 的定義

%include "boot.inc"  

section loader vstart=loader_base_addr

mov byte [gs:0x00],'2'

mov byte [gs:0x01],0xa4

mov byte [gs:0x02],''

mov byte [gs:0x03],0xa4

mov byte [gs:0x04],'l'

mov byte [gs:0x05],0xa4

mov byte [gs:0x06],'d'

mov byte [gs:0x07],0xa4

mov byte [gs:0x08],'r'

mov byte [gs:0x09],0xa4

jmp $

於此,完成了從mbr到loader的接力,開始載入核心。核心載入器中要完成從實模式到保護模式的過渡

MBR (主引導記錄)

概念 包含三部分 主引導記錄 masterbootrecord,mbr 共446位元組。在此記錄著一段可執行 因系統而異。但都是用於裝載第二引導裝載程式。windows產生的mbr裝載執行pbr grub產生的mbr裝載執行grldr。功能 檢查硬碟分割槽表是否完好。在分割槽表中尋找可引導的 活動 ...

磁碟主引導記錄(MBR)

mbr master boot record 中文意為主引導記錄。電腦開機後,主機板自檢完成後,被第乙個讀取到的磁碟位置。硬碟的0磁軌的第乙個扇區稱為mbr,它的大小是512位元組,它是不屬於任何乙個作業系統,也不能用作業系統提供的磁碟操作命令來讀取。dos時代氾濫成災的引導區病毒多寄生於此。電腦系...

硬碟主引導記錄 MBR 及其結構

硬碟的0柱面 0磁頭 1扇區稱為主引導扇區,fdisk程式寫到該扇區的內容稱為主引導記錄 mbr 該記錄占用512個位元組,它用語硬碟啟動時將系統控制權交給使用者指定的,並在分割槽表中登記了的某個作業系統區。1.mbr的讀取 硬碟的引導記錄 mbr 是不屬於任何乙個作業系統,也不能用作業系統提供的磁...