【问题标题】:MBR Booting from DOSMBR 从 DOS 启动
【发布时间】:2010-04-14 16:38:02
【问题描述】:

对于一个项目,我想直接从 DOS 调用第一个硬盘上的 MBR。我编写了一个小型汇编程序,它在 0:7c00h 将 MBR 加载到内存中,并跳到了很远的地方。我已将我的实用程序放在(DOS)可引导软盘上。我正在尝试引导的磁盘(HD0,0x80)上有一个 TrueCrypt 引导加载程序。当我在此设置中运行该工具时,它会显示 TrueCrypt 屏幕,但在输入密码后它会导致系统崩溃。当我在普通的 WinXP 机器上运行我的小实用程序 (w00t.com) 时,它似乎立即崩溃了。

显然,我忘记了 BIOS 通常会做的一些重要事情,我猜这是一些微不足道的事情。有更好的裸机 DOS 和 BIOS 经验的人可以帮助我吗?

这是我的代码:

.MODEL tiny
.386
_TEXT SEGMENT USE16

INCLUDE BootDefs.i

ORG 100h

start:
    ; http://vxheavens.com/lib/vbw05.html
    ; Before DOS has booted the BIOS stores the amount of usable lower memory 
    ; in a word located at 0:413h in memory. We going to erase this value because
    ; we have booted dos before loading the bootsector, and dos is fat (and ugly).

    ; fake free memory  
    ;push ds
    ;push   0
    ;pop        ds
    ;mov        ax, TC_BOOT_LOADER_SEGMENT / 1024 * 16 + TC_BOOT_MEMORY_REQUIRED
    ;mov    word ptr ds:[413h], ax  ;ax = memory in K
    ;pop ds
    ;lea si, memory_patched_msg
    ;call print

    ;mov ax, cs
    mov ax, 0
    mov es, ax

    ; read first sector to es:7c00h (== cs:7c00)
    mov  dl, 80h
    mov  cl, 1
    mov  al, 1
    mov  bx, 7c00h ;load sector to es:bx
    call read_sectors

    lea si, mbr_loaded_msg
    call print

    lea si, jmp_to_mbr_msg
    call print

    ;Set BIOS default values in environment
    cli
    mov dl, 80h ;(drive C)
    xor ax, ax
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 0ffffh
    sti

    push es
    push 7c00h
    retf            ;Jump to MBR code at 0:7c00h


    ; Print string
print:
    xor bx, bx
    mov ah, 0eh
    cld

@@: lodsb
    test al, al
    jz print_end

    int 10h
    jmp @B

print_end:
    ret

    ; Read sectors of the first cylinder
read_sectors:
    mov ch, 0           ; Cylinder
    mov dh, 0           ; Head
                        ; DL = drive number passed from BIOS
    mov ah, 2
    int 13h
    jnc read_ok

    lea si, disk_error_msg
    call print
read_ok:
    ret

memory_patched_msg      db 'Memory patched', 13, 10, 7, 0
mbr_loaded_msg          db 'MBR loaded', 13, 10, 7, 0
jmp_to_mbr_msg          db 'Jumping to MBR code', 13, 10, 7, 0
disk_error_msg          db 'Disk error', 13, 10, 7, 0

_TEXT ENDS
END start

【问题讨论】:

    标签: assembly bootstrapping bootloader bare-metal truecrypt


    【解决方案1】:

    已编辑 -- 新答案:

    好的,好像我首先误解了你的问题。我能给出的唯一进一步建议是:

    • 检查您是否未加载 HIMEM.SYS 和/或 EMM386.EXE(或任何其他内存管理器)。当引导加载程序执行时,CPU 必须处于实模式。

    • 查看 Ralf Brown 的中断列表。如果我没记错的话,那里有一些关于启动过程的技术信息。它可能会给你一个提示。

    • 查看其他加载程序实用程序的源代码,例如loadlin。 (它与您的实用程序做的事情并不完全相同,但可能会给您一些见解。)


    上一个答案:

    ORG 100h 在引导加载程序中真的正确吗?

    我认为这仅与 DOS .com 可执行文件相关,因为 DOS 将使用程序段前缀 (PSP) 初始化前 256 个字节。如果您编写引导加载程序,则没有 DOS,也没有 PSP 之类的东西。我想这必须是ORG 0

    【讨论】:

    • 它确实是一个 COM 文件,所以这就是它在 100h 时被 ORGed 的原因。就像任何其他 .com 文件一样。它将 MBR 加载到 mem 并跳转到 is。正如您在我最初的问题中所读到的,它实际上完成了这项工作:TrueCrypt 引导加载程序启动并显示正确的屏幕。所以加载和跳跃工作。只有在那之后,计算机才会死机。肯定有问题,可能是环境设置不正确?
    • 不,即使在 Windows(XP) 中使用此实用程序加载引导加载程序到地址 0:7c00 也是不可能的。您不能直接从 Windows 访问磁盘,也不能只是在内存中四处寻找。但是请在我的问题中阅读我正在从软盘(图像)运行该工具,即它在 DOS 下运行,16 位实模式。再者其实是已经做好了一部分工作; TC Bootloader 启动并显示“欢迎来到 TC,请输入密码”屏幕。只有在那之后它才会崩溃。所以,BIOS正常设置的环境一定有问题。
    • 为了您的信息、兴趣或晚安:当您在 WinXP 下运行此类可执行文件时,实际上什么都不会发生,Windows 会抱怨您直接在驱动器上乱搞并停止应用程序。
    • 好的.. 感谢您的新答案!无论如何,内存管理器可能是所有麻烦的原因,因为我正在从引导软盘运行 himem.sys。我会试一试。附带说明:对我来说,DOS 中的内存管理对我来说是一种黑魔法。我对此知之甚少(因为它是“多余的遗产”知识),在网上也找不到太多关于它的信息……(出于同样的原因)。
    • 在没有 himem.sys 的情况下尝试过仍然是同样的问题。有趣的是,它确实加载了 MBR。在这种情况下,它是 TrueCrypt MBR。这个 TrueCrypt 引导加载程序确实有效,它能够加载它的第二阶段。您可以输入密码(它是一个加密的系统卷),但它在将控制权交给操作系统 laoder(在本例中为 winxp)之前挂起。有任何想法吗?也许周围有一些grub devver? :)
    【解决方案2】:

    好吧,我的 DOS 知识很生疏,我没有时间测试/验证我的答案,但我猜你的问题如下:

    在启动 DOS 或任何其他操作系统时,它们会更改中断表。 DOS 将更改中断表,例如,中断 20 可用于向 DOS“内核”发送命令。他们通过保存原始中断处理程序,用他们自己的处理程序替换它来做到这一点,然后,作为默认的后备,如果他们不知道如何处理中断,则链接到原始中断处理程序。这样他们就可以在现有的 bios 功能中“添加”新功能,并且在 DOS 下运行的每个程序都可以通过设置一些寄存器然后调用中断来使用系统调用。

    但是,当您启动一个新操作系统时,这个新操作系统将假定 a) 所有中断都由 bios 处理,并且 b) 所有内存都是空闲/未使用的,除非该 bios 报告正在使用。

    因此,新操作系统将覆盖旧操作系统当前使用的内存,然后它会在某个时候调用其中一个中断,并在无效内存中执行某些操作,然后您的计算机将崩溃。

    所以,将你的中断表重置为原始的 bios 版本,你应该没问题...

    【讨论】:

    • 嘿,这听起来很合理!谢谢。
    【解决方案3】:

    我不认为这是一个引导加载程序,它是加载引导扇区并尝试执行它的 .com 文件。所以它在 DOS 初始化后运行。

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 2010-10-10
      • 1970-01-01
      • 2020-05-02
      • 2010-11-23
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多