《操作系统真象还原》第三章----总结(完善MBR)
操作系统真象还原第三章----总结(完善MBR)
启动顺序
BIOS——》MBR—》loder
MBR访问显存
是BIOS虚拟机显示“1 MBR”可以让我们更直观感受到BIOS真的调用了MBR。
代码在书中比较简单,并且后面利用MBR访问硬盘时,正好用到这部分短代码所以就不贴出来了。
描述:MBR在闪烁
MBR访问硬盘
目的:找到loder程序 将其加载到内存之中。
代码:
-------------boot.inc 代码----------------------
LOADER_BASE_ADDR equ 0x900 ;定义loder在内存中的位置0x900
LOADER_START_SECTOR equ 0x2 ;定义了loder在硬盘的位置 在第二
扇区
-----------------MBR v3.0________
“先显示1 MBR”,然后调用loader程序
%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,0600h
mov bx,0700h
mov cx,0
mov dx,184fh
int 10h;
;输出字符MBR
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 ;起始扇区的lba地址存入eax中
mov bx,LOADER_BASE_ADDR ;写入内存的地址 存入bx中
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
;LBA地址存入0x1f3 - 0x1f6
mov dx,0x1f3
out dx,al
;LBA地址15~8位写入端口0x1f3
mov cl,8
shr eax,cl
mov dx,0x1f4
out dx,al
;LBA地址23~16位写入端口0x1f3
shr eax,cl
mov dx,0x1f5
out dx,al
shr eax,cl
and al,0x0f
or al,0xe0
mov dx,0x1f6
out dx,al
;在0x1f7端口写入命令
mov dx,0x1f7
mov al,0x20
out dx,al
;检测硬盘的状态
.not_ready:
nop
in al,dx
and al,0x08
cmp al,0x08
jnz .not_ready
;从0x1f0端口读数据
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------------------
Loder程序写入硬盘之中,当成功调用loader程序时,将在显示器上显示“2 LODER”,并且是由“1 MBR”跳过来的
%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],'O'
mov byte [gs:0x07],0xA4
mov byte [gs:0x08],'A'
mov byte [gs:0x09],0xA4
mov byte [gs:0x0a],'D'
mov byte [gs:0x0b],0xA4
mov byte [gs:0x0c],'E'
mov byte [gs:0x0d],0xA4
mov byte [gs:0x0e],'R'
mov byte [gs:0x0f],0xA4
jmp $
----------------------------------loader-------------------------
MBR 写入硬盘,再将LOODER程序写入硬盘
–》将mbr.bin 、loder.bin写入硬盘hdM60中
成功运行图片
描述:从MBR成功跳转到LOADER
外部设备传送数据的方式
1、查询传送方式
2、中断传送方式
3、DMA方式
总结
用了几天刚看完《汇编语言》王爽版的,对于整个汇编指令和偏硬件部分有了深一步的认识,
懂不懂汇编对理解这本书还有代码真的有很大区别,所以强烈建议先去学习汇编在学习这本书,下一步打算看一看x86。难受,上学期学的没好好听,以为不是必修课就不好好学,到头来还得自己补,难受。
在这一章当中,仍旧有很多代码看不懂,限于自己水平有限无法对于代码做出详细解读。
相信自己以后一定会看懂的
加油~