Articulo de referencia

INT 13H

INT 13h es la abreviatura de 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 PC de I...

INT 13h es la abreviatura de 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 PC de IBM). La BIOS normalmente configura un controlador de interrupción en modo real en este vector que proporciona servicios de lectura y escritura de disco duro y disquete basados ​​en sectores utilizando el direccionamiento de sector de cabeza de cilindro (CHS). Las BIOS de PC modernas también incluyen funciones de extensión INT 13h, originadas por IBM y Microsoft en 1992, que proporcionan esos mismos servicios de acceso al disco utilizando el direccionamiento LBA de 64 bits ; con pequeñas adiciones, estas fueron estandarizadas casi por completo por Phoenix Technologies y otros como las extensiones de BIOS EDD ( Enhanced Disk Drive ).

INT es una instrucción x86 que activa una interrupción de software , y 13 hex es el número de interrupción (como valor hexadecimal ) que se está llamando.

Los ordenadores modernos incluyen funcionalidad BIOS INT 13h y UEFI , que ofrecen los mismos servicios e incluso más, con la excepción de UEFI Clase 3, que elimina por completo CSM y, por lo tanto, carece de INT 13h y otras interrupciones. Normalmente, los controladores UEFI utilizan el direccionamiento LBA en lugar del direccionamiento CHS.

Descripción general

En sistemas operativos de modo real , como DOS , la llamada a INT 13h accedería al código ROM-BIOS del ordenador para acceder a los servicios de disco de bajo nivel , que realizarían 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 bloques integrados para discos duros y disquetes . Esto permite que INT 25h e INT 26h proporcionen funciones de lectura/escritura de disco absolutas para sectores lógicos al controlador del sistema de archivos FAT en el núcleo de DOS, que gestiona las solicitudes relacionadas con archivos a través de las funciones de la 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 for Workgroups 3.11 también omiten las rutinas del BIOS cuando utilizan el acceso a disco de 32 bits . Además de realizar acceso a 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 dispositivos DASD ) conectados al sistema; cuando un sistema operativo arranca en modo protegido, puede utilizar esa información del BIOS para enumerar el hardware del disco de modo que pueda cargar y configurar los controladores de E/S de disco adecuados.

La interfaz INT 13h original del BIOS en modo real admite unidades de hasta aproximadamente 8 GB mediante el direccionamiento físico CHS . Este límite proviene de la interfaz de hardware del disco duro del IBM PC/XT . El BIOS utilizaba la dirección del sector de la cabeza del cilindro (CHS) proporcionada en la llamada INT 13h y la transfería directamente a la interfaz de hardware. Un límite menor, de aproximadamente 504 MB, se imponía mediante la combinación de los límites de direccionamiento CHS del BIOS y los de los discos duros ATA, que son diferentes. Al combinar los límites de direccionamiento CHS del BIOS y del ATA (es decir, al aplicarlos 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 que permite a la BIOS simular una geometría CHS ficticia en la interfaz INT 13h, mientras se comunica con la unidad ATA utilizando su geometría CHS lógica nativa. (Para cuando se alcanzó la barrera de los 504 MB, los discos ATA ya habían dejado de presentar sus parámetros de geometría física reales en la interfaz ATA externa). La traducción permite a la BIOS, que sigue utilizando el direccionamiento CHS, direccionar eficazmente discos ATA de hasta 8064 MB, la capacidad nativa de la interfaz CHS de la BIOS. (La interfaz ATA tiene una capacidad de direccionamiento CHS nativa mucho mayor, por lo que, una vez resuelta la "interferencia" de los límites CHS de la BIOS y la ATA mediante el direccionamiento, solo la limitación menor de la BIOS resultó significativa). A veces se hace referencia a la traducción CHS como direccionamiento CHS lógico , pero en realidad es un término incorrecto, ya que en el momento del desarrollo de esta BIOS, las direcciones CHS de ATA 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 llamada basada en el valor del 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 cabezales, 63 sectores y bloques de 512 bytes, lo que permite exactamente 7,875 GiB de direccionamiento (1024 × 256 × 63 × 512  bytes ). Hubo brevemente varias BIOS que ofrecían versiones incompatibles de esta interfaz ; por ejemplo, las BIOS AWARD AT y AMI 386sx 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 (incluidas MS-DOS 7 y Windows 95 ) tienen un error que impide el arranque de unidades de disco con 256 cabezales (valor de registro 0xFF), por lo que muchas BIOS modernas proporcionan asignaciones de traducción CHS con un máximo de 255 (0xFE) cabezales , [ 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 Extensiones INT 13h , que luego fue republicada y ligeramente ampliada por Phoenix Technologies como parte de los Servicios de Unidad de Disco Mejorados (EDD) de BIOS. [ 4 ] [ 5 ] Define nuevas funciones dentro del servicio INT 13h, todas con números de función mayores que 40h, que utilizan direccionamiento de bloques lógicos (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 PiB respectivamente, suponiendo un tamaño de sector/bloque 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 la interfaz, el tamaño de los datos y los LBA. Para garantizar la retrocompatibilidad del software, las funciones extendidas se implementan junto con las funciones CHS originales, y las llamadas a funciones de ambos conjuntos se pueden intercalar, incluso para la misma unidad, con la salvedad de que las funciones CHS no pueden acceder más allá de los primeros 8064 MB del disco.

Algunos controladores de caché vacían sus búferes cuando detectan que se está eludiendo la protección DOS mediante la emisión directa de INT 13h desde las aplicaciones. Una lectura ficticia a través de INT 13h puede utilizarse como uno de los varios métodos para forzar el vaciado de la caché para cachés desconocidas (por ejemplo, antes de reiniciar). [ 1 ] [ 2 ]

Las BIOS de AMI de alrededor de 1990-1991 desechan búferes no alineados de palabras. Algunos programas de DOS y programas residentes que terminan y permanecen en el sistema sobrescriben la habilitación de interrupciones 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 disquetes como para discos duros.

  • FD: solo para disquetes.
  • HD: solo para disco duro.
  • PS/2: solo para discos duros en sistemas 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 : Reiniciar el sistema de disco

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

El bit 7=0 corresponde a la unidad de disquete y el bit 7=1 a la unidad de disco fijo.

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

Observaciones

La BIOS INT 13h puede leer un máximo de 18 sectores de forma universal.

El registro CX contiene tanto el número de cilindro (10 bits , valores posibles de 0 a 1023) como el número de sector (6 bits, valores posibles de 1 a 63). Los bits del cilindro y del sector se numeran 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 $FF00 ) shr 8 ) o ( ( CX y $C0 ) shl 2 ) sector := CX y 63 ;

Debido a que el IBM PC original usaba un controlador DMA Intel 8237 de 16 bits , las transferencias DMA utilizadas para transferir datos hacia y desde el sistema de disco no pueden cruzar un límite de dirección física de 64K. Algunas versiones de BIOS no tienen esto en cuenta. Por lo tanto, los búferes pasados ​​a esta función no deben cruzar dicho límite. Esta limitación se aplica a la dirección después del cálculo de la dirección a partir del segmento y el desplazamiento. Por ejemplo, leer 4 sectores en la dirección segmentada 0fc0h:0000hviola esta restricción. Aunque el rango de desplazamientos en el segmento es 0000hde a 0800h, la transferencia escribiría en el rango de direcciones 0fc00ha 10400h, que cruza el límite de 64K en 10000h. Esta restricción también se aplica a la interrupción 13h función 03h, escribir sectores.

La función 02h de la interrupción 13h solo puede leer los primeros 16.450.560 sectores de su disco duro. Para leer sectores que superen el límite de 8 GB, debe usar la función 42h de las extensiones de la interrupción 13h . Otra alternativa es la interrupción 25h de DOS, que lee sectores dentro de una partición.

Ejemplo de código

[ ORG 7c00h ] ; el código comienza en 7c00h xor ax , ax ; asegúrese de que ds esté establecido en 0 mov ds , ax cld ; comience a poner valores: mov ah , 2h ; función int13h 2 mov al , 63 ; queremos leer 63 sectores mov ch , 0 ; desde el cilindro número 0 mov cl , 2 ; el sector número 2 - segundo sector (comienza desde 1, no desde 0) mov dh , 0 ; número de cabeza 0 xor bx , bx mov es , bx ; es debe ser 0 mov bx , 7e00h ; 512 bytes desde la dirección de origen 7c00h int 13h jmp 7e00h ; salte 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 debería comenzar el archivo asm), puede escribir código y este se cargará en la memoria y se ejecutará.

Fíjese en que no hemos cambiado dl (la unidad). Esto se debe a que, al iniciar el ordenador, dl se establece con el número de la unidad desde la que se inició el sistema. Por lo tanto, si queremos leer desde la unidad desde la que se inició el sistema, no es necesario cambiar dl, salvo que algunos emuladores, como qemu, requieren que se especifique la unidad dl de la que se desea leer.

INT 13h AH=03h : Escribir sectores en la unidad

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

INT 13h AH=05h : Formato de pista

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

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

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

Observaciones

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

INT 13h AH=09h : Inicializar las características del par de accionamiento

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

La única diferencia entre esta función y la función 02h (ver más 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 extendida desde la unidad

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

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

INT 13h AH=48h : Parámetros de unidad de lectura extendida

Observación

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

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

Véase también

Referencias

  1. 1 2 Brown, Ralf D. (2000-07-16). "Ralf Browns Interrupt List (v61 html)" . Recuperado el 2016-11-03 .
  2. 1 2 Brown, Ralf D. (2000-07-16). "The x86 Interrupt List (v61 original text) archive: "inter61a.zip", subfile: "INTERRUP.B", heading: "B-1302" (INT13, 02 Read), Notes" . Recuperado el 2016-11-03 .
  3. Limitaciones de tamaño del disco, el límite de 8,4 GB (y otros)
  4. Stevens, Curtis (1995-01-26). "Especificación mejorada de la unidad de disco 1.1 -BORRADOR- Phoenix Technologies, ver extensiones de BIOS 3.0 (se requiere registro)" (PDF) . Recuperado el 2016-11-03 .
  5. Landis, Hale (1995-02-11). "Tipos de BIOS, traducción CHS, LBA y otras cosas buenas, véase BIOS Tipo 6 Especificación de la unidad de disco mejorada Phoenix. (se requiere registro)" (PDF) . Recuperado el 2016-11-03 .
  6. ctyme.com - Lista de interrupciones de Ralf Brown, HTML indexado, DISCO - LEER SECTOR(ES) EN MEMORIA
  7. 1 2 3 4 5 6 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 LA INSTALACIÓN
  9. - LBA en modo extendido
  • Extensiones de interrupción de BIOS 13h archivadas el 6 de febrero de 2006 en Wayback Machine .
  • Lista de interrupciones completa de Ralf Brown
  • Guía de Norton sobre int 13h, ah = 00h .. 1ah Archivada el 27/06/2008 en Wayback Machine