- 论坛徽章:
- 0
|
原帖由 jjj137 于 2009-1-31 22:16 发表 
我的意思是直接加载下一个模块setup不行么?毕竟bootsect已经在0x7c00了,可以直接运行。不复制bootsect不是可以减少出错的几率么?对于实模式来说,操作应该越少越好吧……
0x7c00 被加载进去的是 MBR,linux 的 0x7c00 我没看过是怎样的,
windows vista 的 0x7c00 区域我倒是略为看过。
int 19h 把磁盘的 MBR 加载到 0x7c00(不是 bootsect),转到 0x7c00,然后搬到 0x6000 继续执行
MBR 的主要任务的,检查磁盘4个主分区,发现第1个可启动分区时,将这个分区的 bootsect 重新加载到 0x7c00 再执行,这时候才是加载的分区的 bootsect。
贴一段 vista 安装的 MBR,如下:
00007c00: xor ax, ax
00007c02: mov ss, ax
00007c04: mov sp, 0x7c00
00007c07: mov es, ax
00007c09: mov ds, ax
00007c0b: mov si, 0x7c00
00007c0e: mov di, 0x0600
00007c11: mov cx, 0x0200
00007c14: cld
00007c15: rep movsb byte ptr es:[di], byte ptr ds:[si] /* 搬到 0x6000, 长度 512 字节 */
00007c17: push ax
00007c18: push 0x061c
00007c1b: retf
00007c1c: sti
00007c1d: mov cx, 0x04
00007c20: mov bp, 0x07be
00007c23: cmp byte ptr ss:[bp], 0x00 /* 检查引导标志,是否为 0x80,可启动标志 */
00007c27: jl .+0x0b (0x00007c34)
00007c29: jnz .+0x0110 (0x00007d3d)
00007c2d: add bp, 0x10
00007c30: loop .+0xfff1
00007c32: int 0x18
00007c34: mov byte ptr ss:[bp], dl /* dl = 0x80, 写引导标志为 0x80 */
00007c37: push bp
00007c38: mov byte ptr ss:[bp+0x11], 0x05 /* 写第2个分区表*/
00007c3c: mov byte ptr ss:[bp+0x10], 0x00 /* 写第2个分区表*/
00007c40: mov ah, 0x41
00007c42: mov bx, 0x55aa
00007c45: int 0x13 /* 检查扩展功能是否存在 */
00007c47: pop bp
00007c48: jb .+0x000f /* 假如出错 */
00007c4a: cmp bx, 0xaa55
00007c4e: jnz .+0x0009
00007c50: test cx, 0x01
00007c54: jz .+0x03
00007c56: inc byte ptr ss:[bp+0x10]
00007c59: pushad
00007c5b: cmp byte ptr ss:[bp+0x10], 0x00
00007c5f: jz .+0x26
00007c61: push 0x00
00007c67: push dword ptr ss:[bp+0x08]
00007c6b: push 0x00
00007c6e: push 0x7c00
00007c71: push 0x01
00007c74: push 0x10
00007c77: mov ah, 0x42
00007c79: mov dl, byte ptr ss:[bp]
00007c7c: mov si, sp
00007c7e: int 0x13
00007c80: lahf
00007c81: add sp, 0x10
00007c84: sahf
00007c85: jmp .+0x14
00007c87: mov ax, 0x0201
00007c8a: mov bx, 0x7c00
00007c8d: mov dl, byte ptr ss:[bp]
00007c90: mov dh, byte ptr ss:[bp+0x01]
00007c93: mov cl, byte ptr ss:[bp+0x02]
00007c96: mov ch, byte ptr ss:[bp+0x03]
00007c99: int 0x13 /* 读进第1个分区 */
... ... |
|