前言
这章的内容挺少的,也很简单,如果环境没配置错的话是没啥问题的。但是这章也很精彩,把引导的过程给说了出来,我也是看了几遍把这个过程给大致看懂了。 首先计算机一开机这个时cpu会自动把cs:ip指针赋值成0xf000:0xfff0,根据实模式下的寻址关系可以知道此时正好是指向地址为0xffff0,而这个地址距离最高地址0xfffff之间正好是16字节的地址空间,这肯定是不够BIOS来执行各种硬件初始化以及各种硬件检查和中断向量表的建立等等,所以这里实际上存的跳转的地址,跳转到足够的地址后就会去执行这些,当最后一项任务也就是检查0柱面0磁道1扇区(CHS协议),会在那里发现MBR(主引导程序),这是通过MBR的最后两个字节0x55,0xaa这两个魔数来标明是否为MBR的,之后BIOS会把MBR加载到地址为0x7c00的地址上去,然后BIOS的任务就完成了,就该MBR大显身手了。 关于为何是跳转到地址为0x7c00这更多是根据操作系统的内存布局来决定的,在dos系统时期,操作系统只有32kb,而MBR是512字节,因为MBR本身还是个程序,还需要栈空间,于是再给其分配512字节的栈空间,于是MBR一共占据1KB的空间,把MBR放在最角落的位置,也是为了省出更多空间便于其他使用,32kb用16进制表示就是0x8000减去1kb也就是0x0400,则得到了0x7c00的地址
实验
建立mbr.S文件
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
之后采用linux下的dd指令把,这个文件放入0柱面0磁道1扇区中就可以了 然后运行就可以左边屏幕有一个绿色闪烁的标志1 MBR了。
参考
操作系统真象还原
|