stringtranslate.com

ENT 13H

INT 13h es una abreviatura de llamada de interrupción del BIOS 13 hexadecimal , el vigésimo vector de interrupción en un sistema informático basado en x86 (descendiente de IBM PC). El BIOS generalmente configura un controlador de interrupciones en modo real en este vector que proporciona servicios de lectura y escritura de discos duros y disquetes basados ​​en sectores utilizando direccionamiento de sector de culata (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, estas fueron casi estandarizadas por Phoenix Technologies y otros como extensiones de BIOS EDD ( Unidad de disco mejorada ).

INT es una instrucción x86 que desencadena una interrupción de software , y 13 hex 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 brinda los mismos servicios y más, con la excepción de UEFI Clase 3 que elimina por completo CSM , por lo que carece de INT 13h y otras interrupciones. Normalmente, los controladores UEFI utilizan direcciones LBA en lugar de direcciones CHS.

Descripción general

En sistemas operativos en 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 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 del disco nativo del sistema operativo. Windows 9x y Windows para Trabajo en Grupo 3.11 también omiten las rutinas del BIOS cuando se utiliza Disk Access de 32 bits . Además de realizar acceso al disco de bajo nivel, las llamadas INT 13h y las estructuras de datos BIOS relacionadas también proporcionan información sobre los tipos y capacidades de los discos (u otros dispositivos DASD ) 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 él (el sistema operativo) pueda cargar y configurar los controladores de E/S de disco apropiados.

La interfaz INT 13h en modo real del BIOS original admite unidades de tamaño 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 utilizó la dirección del sector de culata (CHS) proporcionada en la llamada INT 13h y la transfirió directamente a la interfaz de hardware. Un límite menor, alrededor de 504 MB, fue impuesto por la combinación de 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 CHS del BIOS y ATA (es decir, cuando se aplican simultáneamente), la cantidad 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 traducción CHS , una técnica mediante la cual el BIOS simularía 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. (Cuando se estaba acercando a la barrera de los 504 MB, los discos ATA hacía tiempo que habían dejado de presentar sus parámetros de geometría física real en la interfaz ATA externa). La traducción permite que el BIOS, todavía usando el direccionamiento CHS, direccione de manera efectiva discos ATA con tamaños superiores a 8064 MB, la capacidad nativa de la interfaz BIOS CHS sola. (La interfaz ATA tiene una capacidad de direccionamiento CHS nativo mucho mayor, por lo que una vez que se resolvió la "interferencia" de los límites CHS de BIOS y ATA mediante el direccionamiento, sólo la limitación más pequeña del BIOS fue significativa). La traducción de CHS a veces se denomina direccionamiento CHS lógico , 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 llamada basada en valores 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 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 una serie de BIOS que ofrecían versiones incompatibles de esta interfaz; por ejemplo, AWARD AT BIOS y AMI 386sx BIOS se ampliaron para manejar hasta 4096 cilindros colocando los bits 10 y 11 del número de cilindro en los bits 6 y 7 de registrarse 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 cabezales (valor de registro 0xFF), por lo que muchos BIOS modernos proporcionan asignaciones de traducción CHS con como máximo 255 (0xFE) cabezales . , [1] [2] reduciendo así el espacio total direccionable 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 Phoenix Technologies volvió a publicar y amplió ligeramente 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 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 llamadas 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 superar los primeros 8064 MB del disco.

Algunos controladores de caché vacían sus buffers cuando detectan que se omite DOS emitiendo directamente INT 13h desde las aplicaciones. Se puede utilizar una lectura ficticia a través de INT 13h 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, buffers no alineados con palabras basura. Algunos programas de DOS y de terminación y permanencia interrumpen la habilitación y los registros, por lo que PC DOS y MS-DOS instalan sus propios filtros para evitarlo. [6]

Lista de servicios .mw-parser-output .monospaced{font-family:monospace,monospace}INT 13h

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

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

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

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

INT 13h AH=02h : leer sectores desde 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). Las puntas de cilindro y sector están numeradas a continuación:

CX = ---CH--- ---CL---cilindro: 76543210 98sector : 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 ;                                           

El direccionamiento del buffer debe garantizar que el buffer 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 (= 2000 h bytes ) y su búfer comienza en la dirección de memoria 4FF00h. Utilizando la segmentación de memoria , existen diferentes formas de calcular los valores de los registros, por ejemplo:

ES = segmento = 4F00hBX = compensación = 0F00hsuma = dirección de memoria = 4FF00hsería una buena opción porque 0F00h + 2000h = 2F00h <= 10000hES = segmento = 4000hBX = desplazamiento = FF00hsuma = dirección de memoria = 4FF00hno
sería una buena opción porque FF00h + 2000h = 11F00h > 10000h

La función 02h de la interrupción 13h sólo podrá 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 deberá utilizar 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 a las 7c00h xor ax , ax ; asegúrese de que ds esté configurado en 0 mov ds , ax cld ; comience 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 desde 0) mov dh , 0 ; número de cabeza 0 xor bx , bx mueve es , bx ; es debe ser 0 mov bx , 7e00h ; 512 bytes desde la dirección de origen 7c00h int 13h jmp 7e00h ; saltar al siguiente sector ; para llenar este sector y hacerlo arrancable: multiplicado por 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 el 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 suponiendo que queremos leer desde la unidad desde la que iniciamos, 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 banderas de sector incorrecto

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

INT 13h AH=08h : Leer parámetros del variador

Observaciones

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

INT 13h AH=0Ah: Leer sectores largos desde 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 : Verificar 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 garantizar 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 en la unidad

INT 13h AH=48h : Lectura extendida de parámetros del variador

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 tipo de emulación de unidad

Ver también

Referencias

  1. ^ ab Brown, Ralf D. (16 de julio de 2000). "Lista de interrupciones de Ralf Browns (v61 html)" . Consultado el 3 de noviembre de 2016 .
  2. ^ ab Brown, Ralf D. (16 de julio de 2000). "Archivo de la lista de interrupciones x86 (texto original v61):" inter61a.zip", subarchivo: "INTERRUP.B", título: "B-1302" (INT13, 02 Lectura), Notas" . Consultado el 3 de noviembre de 2016 .
  3. ^ Limitaciones de tamaño de disco, límite de 8,4 GB (y otros)
  4. ^ Stevens, Curtis (26 de enero de 1995). "Especificación de unidad de disco mejorada 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 CHS, LBA y otras cosas buenas, consulte BIOS tipo 6, la especificación de unidad de disco mejorada Phoenix. (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(ES) EN LA MEMORIA
  7. ^ abcdef ctyme.com - DISCO - OBTENER PARÁMETROS DE LA UNIDAD (PC, XT286, CONV, PS, ESDI, SCSI)
  8. ^ ctyme.com - Extensiones IBM/MS INT 13 - VERIFICACIÓN DE INSTALACIÓN
  9. ^ - LBA en modo extendido

enlaces externos