- 論壇徽章:
- 0
|
原帖由 jjj137 于 2009-1-31 22:16 發(fā)表 ![]()
我的意思是直接加載下一個(gè)模塊setup不行么?畢竟bootsect已經(jīng)在0x7c00了,可以直接運(yùn)行。不復(fù)制bootsect不是可以減少出錯(cuò)的幾率么?對(duì)于實(shí)模式來說,操作應(yīng)該越少越好吧……
0x7c00 被加載進(jìn)去的是 MBR,linux 的 0x7c00 我沒看過是怎樣的,
windows vista 的 0x7c00 區(qū)域我倒是略為看過。
int 19h 把磁盤的 MBR 加載到 0x7c00(不是 bootsect),轉(zhuǎn)到 0x7c00,然后搬到 0x6000 繼續(xù)執(zhí)行
MBR 的主要任務(wù)的,檢查磁盤4個(gè)主分區(qū),發(fā)現(xiàn)第1個(gè)可啟動(dòng)分區(qū)時(shí),將這個(gè)分區(qū)的 bootsect 重新加載到 0x7c00 再執(zhí)行,這時(shí)候才是加載的分區(qū)的 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, 長(zhǎng)度 512 字節(jié) */
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 /* 檢查引導(dǎo)標(biāo)志,是否為 0x80,可啟動(dòng)標(biāo)志 */
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, 寫引導(dǎo)標(biāo)志為 0x80 */
00007c37: push bp
00007c38: mov byte ptr ss:[bp+0x11], 0x05 /* 寫第2個(gè)分區(qū)表*/
00007c3c: mov byte ptr ss:[bp+0x10], 0x00 /* 寫第2個(gè)分區(qū)表*/
00007c40: mov ah, 0x41
00007c42: mov bx, 0x55aa
00007c45: int 0x13 /* 檢查擴(kuò)展功能是否存在 */
00007c47: pop bp
00007c48: jb .+0x000f /* 假如出錯(cuò) */
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 /* 讀進(jìn)第1個(gè)分區(qū) */
... ... |
|