INT 13H


De Wikipedia, la enciclopedia libre
  (Redirigido desde BIOS Enhanced Disk Drive Services )
Saltar a navegación Saltar a búsqueda

INT 13h es la abreviatura de la llamada de interrupción de BIOS 13 hexadecimal , el vigésimo vector de interrupción en un sistema informático basado en x86 (descendiente de IBM PC). El BIOS normalmente configura un controlador de interrupciones en modo real en este vector que proporciona servicios de lectura y escritura de disco duro y disquete basados ​​en sectores utilizando direccionamiento de sector de cabeza de cilindro (CHS). Los BIOS de PC modernos también incluyen funciones de extensión INT 13h, originadas por IBM y Microsoft en 1992, que brindan esos mismos servicios de acceso al disco utilizando direccionamiento LBA de 64 bits ; con adiciones menores, estos fueron cuasi-estandarizados por Phoenix Technologies y otros como el EDD (Unidad de disco mejorada ) Extensiones de BIOS.

INT es una instrucción x86 que dispara una interrupción de software , y 13 hexadecimal es el número de interrupción (como valor hexadecimal ) que se llama.

Las computadoras modernas vienen con BIOS INT 13h y funcionalidad UEFI que brindan los mismos servicios y más, con la excepción de UEFI Class 3 que elimina completamente CSM, por lo que carece de INT 13h y otras interrupciones. Normalmente, los controladores UEFI utilizan direcciones LBA en lugar de direcciones CHS.

Visión general

En sistemas operativos de modo real , como DOS , llamar a INT 13h saltaría al código ROM-BIOS de la computadora para servicios de disco de bajo nivel , que llevarían a cabo operaciones de lectura o escritura de disco basadas en sectores físicos para el programa. En DOS, sirve como interfaz de bajo nivel para los controladores de dispositivos de bloque integrados para discos duros y disquetes . Esto permite que INT 25h e INT 26h proporcionen funciones absolutas de lectura / escritura de disco para sectores lógicos al controlador del sistema de archivos FAT en el kernel de DOS, que maneja solicitudes relacionadas con archivos a través de funciones de API de DOS ( INT 21h ).

En sistemas operativos en modo protegido , como los derivados de Microsoft Windows NT (por ejemplo, NT4, 2000, XP y Server 2003) y Linux con dosemu , el sistema operativo intercepta la llamada y la pasa al mecanismo de E / S de disco nativo del sistema operativo. Windows 9x y Windows para trabajo en grupo 3.11 también omiten las rutinas del BIOS cuando se usa el acceso al disco de 32 bits . Además de realizar acceso al disco de bajo nivel, las llamadas INT 13h y las estructuras de datos del BIOS relacionadas también proporcionan información sobre los tipos y capacidades de los discos (u otros DASDdispositivos) conectados al sistema; cuando se inicia un sistema operativo en modo protegido, puede usar esa información del BIOS para enumerar el hardware del disco para que (el sistema operativo) pueda cargar y configurar los controladores de E / S del disco adecuados.

La interfaz INT 13h de modo real del BIOS original admite unidades de tamaños de hasta aproximadamente 8 GB utilizando lo que comúnmente se conoce como direccionamiento CHS físico . Este límite se origina en la interfaz de hardware del hardware del disco IBM PC / XT . El BIOS usó la dirección del sector de la cabeza del cilindro (CHS) dada en la llamada INT 13h y la transfirió directamente a la interfaz de hardware. Se impuso un límite menor, alrededor de 504 MB, por la combinación de los límites de direccionamiento CHS utilizados por el BIOS y los utilizados por los discos duros ATA, que son diferentes. Cuando se combinan los límites de direccionamiento de CHS tanto del BIOS como del ATA (es decir, cuando se aplican simultáneamente), el número de sectores de 512 bytes que se pueden direccionar representa un total de aproximadamente 504 MB.

El límite de 504 MB se superó mediante la traducción CHS , una técnica mediante la cual el BIOS simulaba una geometría CHS ficticia en la interfaz INT 13h, mientras se comunicaba con la unidad ATA utilizando su geometría CHS lógica nativa. (Para cuando se acercó la barrera de los 504 MB, los discos ATA habían dejado de presentar sus parámetros de geometría física real en la interfaz ATA externa). exactamente a 8064 MB, la capacidad nativa de la interfaz BIOS CHS por sí sola. (La interfaz ATA tiene una capacidad de direccionamiento CHS nativa mucho mayor, por lo que una vez que se resolvió la "interferencia" de los límites de CHS del BIOS y ATA mediante el direccionamiento, solo la limitación más pequeña del BIOS fue significativa). La traducción de CHS a veces se denomina direccionamiento lógico de CHS, pero en realidad es un nombre inapropiado, ya que en el momento del desarrollo de este BIOS, las direcciones ATA CHS ya eran lógicas, no físicas. El límite de 8064 MB se origina a partir de una combinación de la convención de llamadas basada en el valor de registro utilizada en la interfaz INT 13h y el objetivo de mantener la compatibilidad con versiones anteriores, lo que dicta que el formato o el tamaño de las direcciones CHS pasadas a INT 13h no se pueden cambiar para agregar más bits a uno de los campos, por ejemplo, el campo Número de cilindro. Este límite utiliza 1024 cilindros, 256 cabezas, 63 sectores y bloques de 512 bytes, lo que permite exactamente 7.875 GiB de direccionamiento (1024 * 256 * 63 * 512 bytes). Hubo brevemente una serie de BIOS que ofrecían versiones incompatibles de esta interfaz, por ejemplo,AWARD AT BIOS y AMI 386sx BIOS se han ampliado para manejar hasta 4096 cilindros colocando los bits 10 y 11 del número de cilindro en los bits 6 y 7 del registro DH.

Todas las versiones de MS-DOS (incluidos MS-DOS 7 y Windows 95 ) tienen un error que impide el arranque de unidades de disco con 256 cabezas (valor de registro 0xFF), por lo que muchas BIOS modernas proporcionan asignaciones de traducción CHS con un máximo de 255 (0xFE) cabezas , [1] [2] reduciendo así el espacio direccionable total a exactamente 8032,5 MiB (aproximadamente 7,844 GiB). [3]

Para admitir el direccionamiento de discos aún más grandes, IBM y Microsoft introdujeron una interfaz conocida como INT 13h Extensions , que luego volvió a publicar y fue ligeramente ampliada por Phoenix Technologies como parte de BIOS Enhanced Disk Drive Services (EDD). [4] [5] Define nuevas funciones dentro del servicio INT 13h, todas con números de función mayores a 40h, que utilizan direccionamiento de bloque lógico (LBA) de 64 bits , lo que permite direccionar hasta 8 ZiB . (Una unidad ATA también puede admitir LBA de 28 o 48 bits, lo que permite hasta 128 GiB o 128 PiBrespectivamente, asumiendo un tamaño de bloque / sector de 512 bytes). Esta es una interfaz de "paquete", porque utiliza un puntero a un paquete de información en lugar de la convención de llamada basada en registros de la interfaz INT 13h original. Este paquete es una estructura de datos muy simple que contiene una versión de interfaz, tamaño de datos y LBA. Para la compatibilidad con versiones anteriores del software, las funciones extendidas se implementan junto con las funciones CHS originales, y las llamadas a funciones de ambos conjuntos se pueden mezclar, incluso para la misma unidad, con la salvedad de que las funciones CHS no pueden llegar más allá de los primeros 8064 MB de la disco.

Algunos controladores de caché vacían sus búferes cuando detectan que se pasa por alto DOS al emitir directamente INT 13h desde las aplicaciones. Una lectura ficticia a través de INT 13h se puede utilizar como uno de varios métodos para forzar el vaciado de caché para cachés desconocidos (por ejemplo, antes de reiniciar). [1] [2]

BIOS AMI de alrededor de 1990-1991 búfer no alineados de palabras basura. Algunos programas DOS y TSR interrumpen la habilitación y los registros, por lo que PC DOS y MS-DOS instalan sus propios filtros para evitar esto. [6]

Lista de servicios INT 13h

Si la segunda columna está vacía, la función se puede utilizar tanto para disquete como para disco duro.

  • FD: solo para disquetes.
  • HD: solo para disco duro.
  • PS / 2: solo para disco duro en el sistema PS / 2.
  • EXT: parte de las extensiones INT 13h que se escribieron en la década de 1990 para admitir discos duros con más de 8 GB .

INT 13h AH = 00h : Restablecer sistema de disco

INT 13h AH = 01h : Obtener el estado de la última operación de accionamiento

Bit 7 = 0 para unidad de disquete, bit 7 = 1 para unidad fija

INT 13h AH = 02h : Leer sectores de la unidad

Observaciones

El registro CX contiene tanto el número de cilindro (10 bits , los valores posibles son de 0 a 1023) como el número de sector (6 bits, los valores posibles son de 1 a 63). Los bits de cilindro y sector se enumeran a continuación:

CX = --- CH --- --- CL ---
cilindro: 76543210 98
sector: 543210

Ejemplos de traducción:

CX: = ((cilindro y 255) shl 8) o ((cilindro y 768) shr 2) o sector;
cilindro: = ((CX y 0xFF00) shr 8) o ((CX y 0xC0) shl 2)
sector: = CX y 63;

El direccionamiento del búfer debe garantizar que el búfer completo esté dentro del segmento dado , es decir ( BX + size_of_buffer ) <= 10000h. De lo contrario, la interrupción puede fallar con algunas versiones de BIOS o hardware.

Ejemplo

Suponga que desea leer 16 sectores (= 2000h bytes ) y su búfer comienza en la dirección de memoria 4FF00h. Utilizando la segmentación de memoria , hay diferentes formas de calcular los valores de registro, por ejemplo:

ES = segmento = 4F00h
BX = desplazamiento = 0F00h
suma = dirección de memoria = 4FF00h
sería una buena opción porque 0F00h + 2000h = 2F00h <= 10000h
ES = segmento = 4000h
BX = desplazamiento = FF00h
suma = dirección de memoria = 4FF00h
sería no ser una opción buena porque FF00h + 2000h = 11F00h> 10000h

La función 02h de la interrupción 13h solo puede leer sectores de los primeros 16,450,560 sectores de su disco duro, para leer sectores más allá del límite de 8 GB debe usar la función 42h de INT 13h Extensions. Otra alternativa puede ser la interrupción de DOS 25h que lee sectores dentro de una partición.

Ejemplo de código

 [ORG 7c00h]; el código comienza en 7c00h xor axe, axe; asegúrese de que ds esté configurado en 0 mov ds, hacha cld  ; empezar a poner valores: mov ah, 2h; int13h función 2 mov al, 63; queremos leer 63 sectores mov ch, 0; del cilindro número 0 mov cl, 2; el sector número 2 - segundo sector (comienza desde 1, no 0) mov dh, 0; cabeza numero 0 xor bx, bx mov es, bx; es debe ser 0 mov bx, 7e00h; 512bytes desde la dirección de origen 7c00h int 13h jmp 7e00h; saltar al siguiente sector  ; para llenar este sector y hacerlo arrancable: veces 510 - ($ - $$) db 0 dw 0AA55h

después de esta sección de código (con la que debe comenzar el archivo asm), puede escribir código y se cargará en la memoria y se ejecutará.

observe cómo no cambiamos dl (la unidad). Esto se debe a que cuando la computadora se carga por primera vez, dl se establece en el número de la unidad que se inició, por lo que, asumiendo que queremos leer desde la unidad desde la que arrancamos, no es necesario cambiar dl.

INT 13h AH = 03h : Escribir sectores para conducir

INT 13h AH = 04h : Verificar sectores desde la unidad

INT 13h AH = 05h : Formatear pista

INT 13h AH = 06h : Formatear pista Establecer indicadores de sector defectuoso

INT 13h AH = 07h : Formatear unidad comenzando en la pista

INT 13h AH = 08h : Leer parámetros de accionamiento

Observaciones

  • Los valores lógicos de la función 08h pueden / deben diferir de los valores físicos de CHS de la función 48h.
  • El registro de resultados CX contiene tanto cilindros como valores de sector / pista, consulte la observación de la función 02h.

INT 13h AH = 09h : Características del par de variadores de inicio

INT 13h AH = 0Ah: leer sectores largos de la unidad

La única diferencia entre esta función y la función 02h (ver arriba) es que la función 0Ah lee 516 bytes por sector en lugar de solo 512. Los últimos 4 bytes contienen el Código de corrección de errores (ECC), una suma de verificación de los datos del sector.

INT 13h AH = 41h : Comprobar extensiones presentes

INT 13h AH = 42h : Sectores de lectura extendidos desde la unidad

Como ya se indicó con int 13h AH = 02h, se debe tener cuidado para asegurarse de que el búfer completo esté dentro del segmento dado , es decir (BX + size_of_buffer) <= 10000h

INT 13h AH = 43h : Sectores de escritura extendidos para conducir

INT 13h AH = 48h : Parámetros de accionamiento de lectura extendidos

Observación

Los valores físicos de CHS de la función 48h pueden / deben diferir de los valores lógicos de la función 08h.

INT 13h AH = 4Bh: Obtener el tipo de emulación de unidad

Ver también

  • INT 10H
  • Llamada de interrupción del BIOS
  • Sector de culata
  • INT (instrucción x86)
  • DPMI (interfaz de modo protegido de DOS)
  • Lista de interrupciones de Ralf Brown
  • Especificación de la unidad de disco mejorada del BIOS

Referencias

  1. ↑ a b Brown, Ralf D. (16 de julio de 2000). "Lista de interrupciones de Ralf Browns (v61 html)" . Consultado el 3 de noviembre de 2016 .
  2. ↑ a b Brown, Ralf D. (16 de julio de 2000). "Archivo de la Lista de interrupciones x86 (texto original v61):" inter61a.zip ", subarchivo:" INTERRUP.B ", encabezado:" B-1302 "(INT13, 02 Lectura), Notas" . Consultado el 3 de noviembre de 2016 .
  3. ^ Limitaciones de tamaño del disco, el límite de 8.4 GB (y otros)
  4. Stevens, Curtis (26 de enero de 1995). "Especificación mejorada de la unidad de disco 1.1 -BORRADOR- Phoenix Technologies, consulte Extensiones de BIOS 3.0 (se requiere registro)" (PDF) . Consultado el 3 de noviembre de 2016 .
  5. Landis, Hale (11 de febrero de 1995). "Tipos de BIOS, traducción de CHS, LBA y otras cosas buenas, consulte la especificación de la unidad de disco mejorada Phoenix tipo 6 de BIOS (se requiere registro)" (PDF) . Consultado el 3 de noviembre de 2016 .
  6. ^ ctyme.com - Lista de interrupciones de Ralf Browns, html indexado, DISCO - LEER SECTOR (S) EN LA MEMORIA
  7. ^ a b c d e f ctyme.com - DISCO - OBTENER PARÁMETROS DE LA UNIDAD (PC, XT286, CONV, PS, ESDI, SCSI)
  8. ^ ctyme.com - Extensiones IBM / MS INT 13 - COMPROBACIÓN DE INSTALACIÓN
  9. ^ - LBA en modo extendido

enlaces externos

  • Extensiones BIOS Interrupt 13h
  • Lista completa de interrupciones de Ralf Brown
  • Guía Norton sobre int 13h, ah = 00h .. 1ah
Obtenido de " https://en.wikipedia.org/w/index.php?title=INT_13H&oldid=1045579407#EDD "