INT 13h es la abreviatura de llamada de interrupción del BIOS 13 hex , el vigésimo vector de interrupción en un sistema informático basado en x86 (descendiente de IBM PC). El BIOS normalmente configura un manejador de interrupciones en modo real en este vector que proporciona servicios de lectura y escritura de disco duro y disquete basados en sectores mediante direccionamiento de sector de cabezal cilíndrico (CHS). Los BIOS de PC modernos 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 mediante direccionamiento LBA de 64 bits ; con adiciones menores, estas fueron casi estandarizadas por Phoenix Technologies y otros como las extensiones de BIOS EDD ( Unidad de disco mejorada ).
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 llama.
Las computadoras modernas vienen con funcionalidades BIOS INT 13h y UEFI que brindan los mismos servicios y 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. Por lo general, los controladores UEFI usan direccionamiento LBA en lugar de direccionamiento CHS.
En sistemas operativos en modo real , como DOS , al llamar a INT 13h se 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 núcleo DOS, que maneja las solicitudes relacionadas con archivos a través de funciones de la API 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 SO 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 utilizan 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 dispositivos DASD ) conectados al sistema; cuando un SO en modo protegido arranca, puede utilizar esa información del BIOS para enumerar el hardware del disco de modo que este (el SO) pueda cargar y configurar los controladores de E/S de disco adecuados.
La interfaz INT 13h en modo real del BIOS original admite unidades de hasta 8 GB aproximadamente utilizando lo que comúnmente se conoce como direccionamiento CHS físico . Este límite se origina en la interfaz de hardware del hardware de disco IBM PC/XT . El BIOS utilizó la dirección del sector de cabezal cilíndrico (CHS) proporcionada en la llamada INT 13h y la transfirió directamente a la interfaz de hardware. Se impuso un límite menor, de unos 504 MB, mediante 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 CHS tanto del BIOS como de 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ó utilizando la traducción CHS , una técnica por 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. (En el momento en que se acercaba la barrera de los 504 MB, los discos ATA hacía mucho 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, que todavía utiliza el direccionamiento CHS, direccione de manera efectiva discos ATA con tamaños de hasta 8064 MB, la capacidad nativa de la interfaz CHS del BIOS solamente. (La interfaz ATA tiene una capacidad de direccionamiento CHS nativo mucho mayor, por lo que una vez que la "interferencia" de los límites CHS del BIOS y ATA se resolvió mediante el direccionamiento, solo la limitación más pequeña del BIOS fue significativa). La traducción CHS a veces se conoce como direccionamiento CHS lógico , pero en realidad es un nombre inapropiado ya que en el momento de este desarrollo del BIOS, las direcciones CHS 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 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 de 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 ). Durante un breve período hubo varios BIOS que ofrecían versiones incompatibles de esta interfaz; por ejemplo, los BIOS AWARD AT y AMI 386sx se ampliaron para manejar hasta 4096 cilindros al colocar 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 (incluyendo 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 muchos BIOS modernos 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 soportar el direccionamiento de discos aún más grandes, IBM y Microsoft introdujeron una interfaz conocida como INT 13h Extensions , que luego fue republicada y 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 que 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 soportar LBA de 28 o 48 bits, lo que permite hasta 128 GiB o 128 PiB respectivamente, asumiendo 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 interfaz, tamaño de datos y LBA. Para lograr 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 combinar, incluso para la misma unidad, con la salvedad de que las funciones CHS no pueden llegar más allá de los primeros 8064 MB del disco.
Algunos controladores de caché vacían sus búferes cuando detectan que se ha pasado por alto el DOS mediante la emisión directa de INT 13h desde las aplicaciones. Se puede utilizar una lectura ficticia a través de INT 13h como uno de los diversos métodos para forzar el vaciado de caché para cachés desconocidos (por ejemplo, antes de reiniciar). [1] [2]
Las BIOS AMI de alrededor de 1990-1991 destruyen los buffers desalineados de palabras. Algunos programas DOS y de terminación y permanencia residentes destruyen los registros y la habilitación de interrupciones, por lo que PC DOS y MS-DOS instalan sus propios filtros para evitar esto. [6]
Si la segunda columna está vacía, la función se puede utilizar tanto para disquetes como para discos duros.
Bit 7=0 para unidad de disquete, bit 7=1 para unidad fija
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 numeran 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 búfer debe garantizar que el búfer completo se encuentre 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.
Supongamos que desea leer 16 sectores (= 2000h bytes ) y que su búfer comienza en la dirección de memoria 4FF00h. Al utilizar la segmentación de memoria , existen diferentes formas de calcular los valores de registro, por ejemplo:
ES = segmento = 4F00hBX = desplazamiento = 0F00hsuma = dirección de memoria = 4FF00hSería una buena elección porque 0F00h + 2000h = 2F00h <= 10000hES = segmento = 4000hBX = desplazamiento = FF00hsuma = dirección de memoria = 4FF00hNo sería una buena elección 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 que superen el límite de 8 GB, debe utilizar la función 42h de INT 13h Extensions. Otra alternativa puede ser la interrupción DOS 25h, que lee sectores dentro de una partición.
[ 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 ingresar valores: mov ah , 2h ; int13h función 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 0) mov dh , 0 ; número de cabezal 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 ; saltar al siguiente sector ; Para llenar este sector y hacerlo arrancable: times 510 - ( $ - $$ ) db 0 dw 0AA55h
Después de esta sección de código (con la que debe comenzar el archivo asm), puedes escribir código y se cargará en la memoria y se ejecutará.
Observe que no cambiamos dl (la unidad). Esto se debe a que cuando la computadora se carga por primera vez, dl se configura con el número de la unidad desde la que se inició, por lo que, suponiendo que queremos leer desde la unidad desde la que iniciamos, no es necesario cambiar dl.
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 comprobación de los datos del sector.
Como ya se indicó con int 13h AH=02h, se debe tener cuidado para garantizar que el buffer completo esté dentro del segmento dado , es decir, (BX + size_of_buffer) <= 10000h
Los valores físicos CHS de la función 48h pueden/deben diferir de los valores lógicos de la función 08h.