前言
这章的内容挺少的,也很简单,如果环境没配置错的话是没啥问题的。但是这章也很精彩,把引导的过程给说了出来,我也是看了几遍把这个过程给大致看懂了。 首先计算机一开机这个时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 了。
参考
操作系统真象还原
|