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 是不屬於任何乙個作業系統,也不能用作業系統提供的磁...