2009-02-14 13 views
5

Recientemente he estado estudiando un código de arranque que estaba destinado para su uso con una unidad de disquete. Mi objetivo es modificar el programa para que use mi memoria USB. Ahora veo cómo se ha usado la función INT 13H con el disquete, pero supongo que mi pregunta es, ¿cómo se diferenciará la comunicación con la unidad USB?¿Cómo realizar IO de bajo nivel con una unidad flash USB en el BIOS (en comparación con un disquete)?

Por ejemplo, aquí es un fragmento del código de disquete (ensamblador GNU):

movb $0x00,%dl  /* select 1st floppy */ 

    /* later */ 

    movw sec,%cx  /* get sector number */ 
    movw head,%dx /* get head number */ 

    movw $0x0201,%ax /* read 1 sector */ 
    int $0x13 

Ahora he leído que se mueve 0x80 en% dl seleccionará el primer disco duro en el BIOS. En mi biografía particular, puedo cambiar el orden de las unidades, que incluiría una unidad USB. Estoy bastante seguro de que esto se está convirtiendo en dependiente de BIOS, pero estaba pensando que el orden enumerado en el BIOS podría corresponder al valor que muevo en% dl. Necesito encontrar documentación ...

No estoy realmente familiarizado con el trabajo con dispositivos de bloque, ¿alguien me puede indicar un buen lugar para comenzar a aprender más?

Gracias!

Respuesta

0

La unidad flash solo está disponible si el BIOS lo admite. Y si lo hace, probablemente ya te permita arrancar desde allí. La mayoría de esto se realiza mediante emulación, por lo que las llamadas para iniciar la unidad flash son probablemente las mismas.

He descargado los bloques de arranque de mis memorias USB y he encontrado los formatos de disquete y disco duro.

Tal vez deberías probar un montón de números para acceder a las unidades y ver cuáles responden.

Creo que Google es tu amigo aquí. Comience con "INT 13H". Y haz más preguntas.

4

La respuesta simple es que si el BIOS puede arrancar desde la unidad flash USB, se pueden usar las mismas funciones de BIOS para el disco flexible/acceso al disco duro.

La respuesta feliz es que una técnica simple permite que el mismo código de sector de arranque para acceder a una imagen de disquete en una unidad flash USB si se ha arrancado con emulación de disco flexible o de emulación de disco duro. Si dl = 80h (emulación de disco duro)

UNIDAD obtener los parámetros
int 13h, ah = 8
de devolución:
CH = número máximo sector (igual que el número de sectores por pista)
dh = número máximo de cabeza (sólo añadir 1 para obtener el número de cabezas)

Esto devuelve información describe la geometría del dispositivo emulado (si dl = 0, entonces es la geometría de disquetera estándar - 18 sectores por pista y 2 cabezas).Esto puede ser usado para calcular la información de culata Sector necesaria requerida para:

SECTOR DE LEER (S)
int 13h, ah = 2

y

escribir sector (S)
int 13h, ah = 3

See Ralf Brown's Interrupt List - int 13h

Ver mi post aquí: USB Booting Secrets

+0

OK, después de haber revisado esto estaba buscando un código (código de trabajo) que explícitamente carga dl = 0x00 aunque está usando una unidad flash USB. Ahora supongo que esto es un comportamiento dependiente de BIOS, quizás otro BIOS no le permita tratar una unidad flash como un disquete. –

+1

Es posible y conveniente iniciar y ejecutar una imagen de disquete FAT12 desde una unidad flash USB en cualquier BIOS/versión que arranque desde una unidad flash USB. El valor dl debe ser utilizado. Incluso si dl = 80h (que será el caso en todas las últimas versiones del modelo BIOS/versión), la geometría del disco duro resintonizó desde int 13h, ah = 8 se puede utilizar. El formato de 1.44 MB, aunque restrictivo, es suficiente para comenzar y es universal. –

3

Si el BIOS "ve" el dispositivo USB como un disco duro se le asignará un número a la misma. El número asignado comienza en 0x80 para el primer disco duro, 0x81 para el segundo, etc. Por lo tanto, dependiendo de cuántos discos duros estén instalados, su unidad USB tendrá 0x81 o más. Además, si cambia el orden en el BIOS, el número de la unidad USB cambiará para reflejar esto.

+0

Realmente me ayudó. Además, no es que algunos BIOS etiqueten directamente la unidad flash 0x80, según [mi pregunta] (http://stackoverflow.com/questions/4703595/nasm-load-code-from-usb-drive). – new123456

+0

Más bien, ** nota ** (el botón de edición es conspicuamente ausente). – new123456

Cuestiones relacionadas