2010-04-14 14 views
6

Para un proyecto me gustaría invocar el MBR en el primer disco duro directamente desde DOS. He escrito un pequeño programa ensamblador que carga el MBR en la memoria a 0: 7c00h y lo hace muy lejos. He puesto mi utilidad en un disquete de arranque (DOS). El disco (HD0, 0x80) que intento arrancar tiene un gestor de arranque TrueCrypt. Cuando ejecuto la herramienta en esta configuración, aparece la pantalla TrueCrypt, pero después de ingresar la contraseña bloquea el sistema. Cuando ejecuto mi utlility poco (w00t.com) en una máquina WinXP normal, parece bloquearse inmediatamente.MBR Arranque desde DOS

Aparentemente me olvido de algunas cosas cruciales que normalmente hace la BIOS, supongo que es algo trivial. ¿Puede ayudarme alguien con una mejor experiencia de BIOS y DOS sin metal?

Aquí está mi código:

.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 

Respuesta

1

Editado - nueva respuesta:

bien, parece como si la primera entendido bien su pregunta. El único otro consejo que puedo dar es la siguiente:

  • Compruebe que no se carga bien HIMEM.SYS y/o EMM386.EXE (ni ningún otro administrador de memoria). La CPU debe estar en modo real cuando se ejecuta el gestor de arranque.

  • Eche un vistazo a la lista de interrupciones de Ralf Brown. Si mal no recuerdo, hay alguna información técnica en algún lugar sobre el proceso de arranque. Puede darte una pista.

  • Mire el código fuente de otras utilidades del cargador, p. loadlin. (No hace exactamente lo mismo que su utilidad, pero podría darle una idea, sin embargo.)


respuesta anterior:

¿Es realmente el ORG 100h Qué cosa correcta hacer en un gestor de arranque?

Pensé que esto era solo relevante para DOS .com ejecutables, porque DOS inicializaría los primeros 256 bytes con el Prefijo de Segmento de Programa (PSP). Si escribe un gestor de arranque, no hay DOS ni PSP. Supongo que esto tiene que ser ORG 0.

+0

Es un archivo COM de hecho, así que eso es porqué está en ORGed 100h. Como cualquier otro archivo .com. Carga el MBR a mem y salta a is. Como puede leer en mi pregunta inicial, realmente hace el trabajo: el gestor de arranque TrueCrypt se inicia y muestra la pantalla derecha. Así que cargar y saltar funciona. Solo después de eso, la computadora se congela. Algo debe estar mal, ¿quizás el entorno no está configurado correctamente? – Rogier

+0

Si ese gestor de arranque TrueCrypt en su disco realmente _espera_ un archivo '.com' normal, entonces el' ORG 100h' no debería ser un problema. De lo contrario, creo que es un error. - En segundo lugar, no sorprende que su programa se bloquee cuando se ejecuta bajo Windows XP. Cuando la computadora se inicia por primera vez, la CPU está en modo real (emulación 8086) y los cargadores de arranque lo esperan. Una vez que Windows XP se haya iniciado, la CPU nunca volverá al Modo Real. Los programas de DOS se pueden ejecutar en lo que se llama el modo Virtual 8086 (si recuerdo el nombre correctamente) y los gestores de arranque no funcionarán en ese modo de CPU. – stakx

+0

No, incluso la carga de un gestor de arranque a la dirección 0: 7c00 no es posible en Windows (XP) con estos utils. No puede acceder al disco directamente desde Windows y no puede simplemente hurgar en la memoria. Pero por favor lea en mi pregunta que estoy ejecutando la herramienta desde disquete (imagen), es decir, se está ejecutando en DOS, modo real de 16 bits. Además, en realidad, ya hace el trabajo en parte; TC Bootloader GETS comenzó y muestra la pantalla "Bienvenido a TC, ingrese contraseña". Solo después de eso se estremece. Ergo, debe haber algo mal en el medio ambiente que el BIOS normalmente establece. – Rogier

0

No creo que sea un gestor de arranque, es un archivo .com que carga el sector de arranque e intenta ejecutarlo. Por lo tanto, se ejecuta después de que se haya inicializado DOS.

1

Ok mis conocimientos DOS es muy oxidada y no he tenido tiempo de probar/validar mi respuesta, pero creo que su problema es el siguiente:

Al arrancar DOS o cualquier otro sistema operativo, que va a cambiar la tabla de interrupción DOS cambiará la tabla de interrupción por lo que, por ejemplo, la interrupción 20 se puede utilizar para enviar comandos al "kernel" de DOS. Lo hacen guardando el controlador de interrupción original, reemplazándolo por su propio controlador y, posteriormente, como alternativa predeterminada, encadenando al manejador de interrupciones original si no saben cómo manejar la interrupción.De esta forma, "agregan" nuevas funcionalidades a la funcionalidad de BIOS ya existente, y cada programa que se ejecuta bajo DOS puede usar la llamada al sistema simplemente configurando algunos registros y luego llamando a la interrupción.

Sin embargo, cuando arranque un nuevo sistema operativo, este nuevo sistema operativo asumirá que a) todas las interrupciones son manejadas por la BIOS yb) toda la memoria es libre/no utilizada a menos que se haya informado de su uso.

De modo que el nuevo sistema operativo sobrescribirá la memoria actualmente en uso por su sistema operativo anterior y luego llamará en algún momento a una de las interrupciones y ejecutará algo en la memoria no válida y su computadora se bloqueará.

Así, restablezca la tabla de interrupciones a la versión original de la BIOS y que debe estar bien ...

+0

¡Oye, esto suena plausible! Gracias. – Rogier

Cuestiones relacionadas