- 直接使用顯卡顯示內容
直接使用顯卡顯示內容
- nasm -o mbr.bin mbr.S
[haifei@localhost boot]$ nasm -o mbr.bin mbr.S
[haifei@localhost boot]$ ll
total 8
-rw-rw-r--. 1 haifei haifei 512 May 14 19:39 mbr.bin
-rw-rw-r--. 1 haifei haifei 1054 May 14 19:38 mbr.S
- 生成hd60M.img
[haifei@localhost bochs-2.6.2]$ bximage -hd -mode="flat" -size=60 -q hd60M.img
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c 11315 2012-08-05 18:13:38Z vruppert $
========================================================================
I will create a 'flat' hard disk image with
cyl=121
heads=16
sectors per track=63
total sectors=121968
total size=59.55 megabytes
The disk image 'hd60M.img' already exists. Are you sure you want to replace it?
Please type yes or no. [no] yes
Writing: [] Done.
I wrote 62447616 bytes to hd60M.img.
The following line should appear in your bochsrc:
ata0-master: type=disk, path="hd60M.img", mode=flat, cylinders=121, heads=16, spt=63
- 將mbr.bin目錄追加到hd60M.img
[haifei@localhost bochs-2.6.2]$ dd if=/home/haifei/bochs2.6.2/bochs-2.6.2/systemCode/c3/a/boot/mbr.bin of=/home/haifei/bochs2.6.2/bochs-2.6.2/hd60M.img bs=512 count=1 conv=notrunc
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000139165 s, 3.7 MB/s
3.啟動bochs
bochs -f .bochsrc
SECTION MBR vstart=0x7c00
mov ax, cs ;使用cs的值去初始化其他寄存器。由于BIOS是通過jmp 0: 0x7c00調轉到MBR上的瓷式,cs此時為0
mov dx, ax
mov es, ax
mov ss, ax
mov fs, ax
mov sp, 0x7c00 ;初始化棧指針
mov ax, 0xb800 ;顯存文本模式殴穴,棧指針
mov gs, ax ;將段基址寫入到gs寄存器中
;清屏
;利用0x06功能號,上卷全部行性雄,則可清屏
;AH 功能號=0x06
;AL 上卷的行數(shù)(如果為0怀读,則為全部)
;BH 上卷的行屬性
;(CL,CH)=窗口左上角的(X,Y)位置
;(DL,DH)=窗口右下角的(X,Y)位置
mov ax, 0600h
mov bx, 0700h
mov cx, 0
mov dx, 184fh
int 10h ;系統(tǒng)中斷
mov byte [gs:0x00], '1'
mov byte [gs:0x01], 0xA4 ;A表示綠色背景閃爍褐耳,4表示前景色為紅色
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 $ ;通過死循環(huán)使程序懸停在這里
times 510-($-$$) db 0
db 0x55,0xaa
由硬盤讀取數(shù)據(jù)
[haifei@localhost boot]$ cat include/boot.inc
;------------loader與kernel-----------------
LOADER_BASE_ADDR equ 0x900
LOADER_START_SECTOR equ 0x2
編譯
nasm -I include/ -o loader.bin loader.S
;主引導程序
;---------------------------------------
%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
;清屏
;利用0x06號功能迟赃,上卷全部行陪拘,則可清屏
;--------------------------------------
;INT 0x10 功能號:0x06 功能描述:清屏
;--------------------------------------
mov ax,0x600
mov bx,0x700
mov cx,0
mov dx,0x184f
int 0x10
;A表示綠色背景閃爍,4表示前景色為紅色
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 ;起始扇區(qū)地址
mov bx,LOADER_BASE_ADDR ;寫入的地址
mov cx,1 ;待讀入的扇區(qū)數(shù)
call rd_disk_m_16 ;以下讀取程序的起始部分(一個扇區(qū))
jmp LOADER_BASE_ADDR
;----------------------------------------------
;功能:讀取硬盤n個扇區(qū)
;----------------------------------------------
rd_disk_m_16:
;eax=LBA扇區(qū)號
;bx=將數(shù)據(jù)寫入的內存地址
;cx=待讀入的扇區(qū)數(shù)
mov esi,eax ;備份eax
mov di,cx ;備份cx
;讀寫硬盤
;第一步:設置讀取的扇區(qū)數(shù)
mov dx,0x1f2
mov al,cl
out dx,al ;讀取的扇區(qū)數(shù)
mov eax,esi ;恢復ax
;第二步:將LBA地址存入0x1f3 ~ 0x1f6
;LBA地址7~0位寫入0x1f3
mov dx,0x1f3
out dx,al
;LBA地址15~8位寫入端口0x1f4
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 ;lba第24-27位
or al,0xe0 ;設置7-4位為1110纤壁,表示lba模式
mov dx,0x1f6
out dx,al
;第三步:向0x1f7端口寫入讀命令左刽,0x20
mov dx,0x1f7
mov al,0x20
out dx,al
;第四步:檢測硬盤狀態(tài)
not_ready:
nop
in al,dx
and al,0x88
cmp al,0x08
jnz not_ready
;第五步:從0x1f0端口讀數(shù)據(jù)
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