INT 13H - INT 13H

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, estas fueron casi estandarizadas por Phoenix Technologies y otros como las extensiones de BIOS EDD ( Enhanced Disk Drive ).

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 a disco de bajo nivel, las llamadas INT 13h y las estructuras de datos de 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 (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 de 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 reales 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 la "interferencia" de los límites de CHS de BIOS y ATA se resolvió mediante 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 de 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 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 varios BIOS que ofrecían versiones incompatibles de esta interfaz; por ejemplo, AWARD AT BIOS y AMI 386sx BIOS se han extendido para manejar hasta 4096 cilindros colocando los bits 10 y 11 del número de cilindro en los bits 6 y 7 de registrar 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 , reduciendo así el espacio direccionable total a exactamente 8032,5 MiB (aproximadamente 7,844 GiB).

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). Define nuevas funciones dentro del servicio INT 13h, todas con números de función superiores 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 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 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 alcanzar 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).

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.

Lista de servicios INT 13h

Mesa de conducción
DL = 00h 1er disquete ("unidad A:")
DL = 01h 2do disquete ("unidad B:")
DL = 02h 3er disquete ("unidad B:")
. . .
DL = 7Fh 128 disquete
DL = 80h 1er disco duro
DL = 81h 2do disco duro
DL = 82h 3er disco duro
. . .
DL = E0h CD / DVD o disco duro número 97
. . .
DL = FFh 128 ° disco duro
Tabla de funciones
AH = 00h   Restablecer el sistema de disco
AH = 01h   Obtener el estado de la última operación de conducción
AH = 02h   Leer sectores desde Drive
AH = 03h   Escribir sectores para impulsar
AH = 04h   Verificar sectores
AH = 05h   Formatear pista
AH = 06h   Formatear pista Establecer indicadores de sector defectuoso
AH = 07h   Formatear la unidad comenzando en la pista
AH = 08h   Leer parámetros de la unidad
AH = 09h HD Inicializar el controlador de disco
AH = 0Ah HD Leer sectores largos desde Drive
AH = 0Bh HD Escribir sectores largos para conducir
AH = 0 canales HD Mover la cabeza motriz al cilindro
AH = 0Dh HD Restablecer unidades de disco
AH = 0Eh PS / 2 Prueba de lectura del controlador
AH = 0Fh PS / 2 Prueba de escritura del controlador
AH = 10 h HD Pruebe si la unidad está lista
AH = 11h HD Vuelva a calibrar la unidad
AH = 12 h PS / 2 Prueba de RAM del controlador
AH = 13h PS / 2 Prueba de conducir
AH = 14h HD Diagnóstico del controlador
AH = 15 h   Leer tipo de unidad
AH = 16 h FD Detectar cambio de medios
AH = 17h FD Establecer el tipo de medio para el formato (utilizado por las versiones de DOS <= 3.1)
AH = 18h FD Establecer tipo de medio para formato (utilizado por versiones de DOS> = 3.2)
AH = 19h   Park Heads
AH = 41 h EXT Pruebe si hay extensiones disponibles
AH = 42 h EXT Leer sectores desde Drive
AH = 43 h EXT Escribir sectores para impulsar
AH = 44 h EXT Verificar sectores
AH = 45 h EXT Bloquear / desbloquear unidad
AH = 46 h EXT Expulsar unidad
AH = 47 h EXT Mover la cabeza motriz al sector
AH = 48 h EXT Leer parámetros de la unidad
AH = 49 h EXT Detectar cambio de medios
AH = 4Bh EXT Obtener el tipo de emulación de unidad

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 el sistema de disco

Parámetros
AH 00h
DL Unidad (el bit 7 establecido significa restablecer tanto el disco duro como el disquete)
Resultados
CF Establecer en caso de error
AH Código de retorno

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

Parámetros
AH 01h
DL Conducir

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

Resultados
AH
Código de retorno
00h Éxito
01h Comando inválido
02h No se puede encontrar la marca de dirección
03h Intento de escritura en disco protegido contra escritura
04h Sector no encontrado
05h Restablecimiento fallido
06h Línea de cambio de disco 'activa'
07h Error en la actividad de los parámetros de la unidad
08h Invasión de DMA
09h Intento de DMA por encima del límite de 64 kb
0Ah Se detectó un sector defectuoso
0Bh Cilindro defectuoso (pista) detectado
0Ch Tipo de medio no encontrado
0Dh Número de sectores no válido
0Eh Marca de dirección de datos de control detectada
0Fh DMA fuera de rango
10h Error de datos CRC / ECC
11h Error de datos corregido ECC
20h Fallo del controlador
40h Buscar el fracaso
80h Se agotó el tiempo de espera de la unidad, se supone que no está lista
AAh Conducir no esta listo
BBh Error indefinido
CCh Error de escritura
E0h Error de estado
FFh Error en la operación de detección
CF Establecer en caso de error, borrar si no hay error

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

Parámetros
AH 02h
Alabama Sectores para leer contar
CH Cilindro
CL Sector
DH Cabeza
DL Conducir
ES: BX Puntero de dirección de búfer
Resultados
CF Establecer en caso de error, borrar si no hay error
AH Código de retorno
Alabama Recuento de lectura de sectores reales

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---
cylinder : 76543210 98
sector   :            543210

Ejemplos de traducción:

CX := ( ( cylinder and 255 ) shl 8 ) or ( ( cylinder and 768 ) shr 2 ) or sector;
cylinder := ( (CX and 0xFF00) shr 8 ) or ( (CX and 0xC0) shl 2)
sector := CX and 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 = segment         = 4F00h
BX = offset          =  0F00h
sum = memory address = 4FF00h
would be a good choice because 0F00h + 2000h = 2F00h <= 10000h
ES = segment         = 4000h
BX = offset          =  FF00h
sum = memory address = 4FF00h
would not be a good choice because 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]   ; code starts at 7c00h
   xor ax, ax    ; make sure ds is set to 0
   mov ds, ax
   cld
   ; start putting in values:
   mov ah, 2h    ; int13h function 2
   mov al, 63    ; we want to read 63 sectors
   mov ch, 0     ; from cylinder number 0
   mov cl, 2     ; the sector number 2 - second sector (starts from 1, not 0)
   mov dh, 0     ; head number 0
   xor bx, bx    
   mov es, bx    ; es should be 0
   mov bx, 7e00h ; 512bytes from origin address 7c00h
   int 13h
   jmp 7e00h     ; jump to the next sector
   
   ; to fill this sector and make it bootable:
   times 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

Parámetros
AH 03h
Alabama Sectores para escribir el recuento
CH Pista
CL Sector
DH Cabeza
DL Conducir
ES: BX Puntero de dirección de búfer
Resultados
CF Establecer en caso de error, borrar si no hay error
AH Código de retorno
Alabama Recuento escrito de sectores reales

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

Parámetros
AH 04h
Alabama Sectores para verificar el recuento
CH Pista
CL Sector
DH Cabeza
DL Conducir
ES: BX Puntero de dirección de búfer
Resultados
CF Establecer en caso de error, borrar si no hay error
AH Código de retorno
Alabama Recuento verificado de sectores reales

INT 13h AH = 05h : Formatear pista

Parámetros
AH 05h
Alabama Sectores para dar formato al recuento
CH Pista
CL Sector
DH Cabeza
DL Conducir
ES: BX Puntero de dirección de búfer
Campo de dirección de 4 bytes
(se aplica a PC / XT 286, AT, PS / 1 y PS / 2)
Byte Sentido Valores permitidos
1 Pista
2 Cabeza
3 Sector
4 Bytes / Sector 0 = 128, 1-256, 2-512, 3-1024
Resultados
CF Establecer en caso de error, borrar si no hay error
AH Código de retorno

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

Parámetros
AH 06h
Alabama Intercalar
CH Pista
CL Sector
DH Cabeza
DL Conducir
Resultados
CF Establecer en caso de error, borrar si no hay error
AH Código de retorno

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

Parámetros
AH 07h
Alabama Intercalar
CH Pista
CL Sector
DH Cabeza
DL Conducir
Resultados
CF Establecer en caso de error, borrar si no hay error
AH Código de retorno

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

Parámetros
Registros
AH 08h = número de función para read_drive_parameters
DL índice de unidad (por ejemplo, 1er disco duro = 80 h)
ES: DI configurado en 0000h: 0000h para solucionar algunos errores de BIOS
Resultados
CF Establecer en caso de error, borrar si no hay error
AH Código de retorno
DL número de unidades de disco duro
DH último índice lógico de cabezas = número_de - 1 (porque el índice comienza con 0)
CX [7: 6] [15: 8] último índice lógico de cilindros = número_de - 1 (porque el índice comienza con 0 )

[5: 0] último índice lógico de sectores por pista = número_de (porque el índice comienza con 1)

licenciado en Derecho tipo de unidad (solo disquetes AT / PS2)
ES: DI puntero a la tabla de parámetros de la unidad (solo para disquetes)

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

Parámetros
AH 09h
DL Conducir
Resultados
CF Establecer en caso de error, borrar si no hay error
AH Código de retorno

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

Parámetros
Registros Descripción
AH 41h = número de función para verificación de extensiones
DL índice de unidad (por ejemplo, 1er disco duro = 80 h)
BX 55AAh
Resultados
Registros Descripción
CF Establecer en No presente, Borrar si está presente
AH Código de error o número de versión principal
BX AA55h
CX Máscara de bits de soporte de interfaz:
  • 1 - Acceso al dispositivo usando la estructura de paquetes
  • 2 - Bloqueo y expulsión de la unidad
  • 4 - Soporte de unidad de disco mejorado (EDD)

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

Parámetros
Registros Descripción
AH 42h = número de función para lectura extendida
DL índice de unidad (por ejemplo, 1er disco duro = 80 h)
DS: SI segmento: puntero de desplazamiento al DAP, ver más abajo
DAP: paquete de direcciones de disco
rango de compensación Talla descripción
00h 1 byte tamaño de DAP (establezca esto en 10 h)
01h 1 byte no utilizado, debe ser cero
02h..03h 2 bytes número de sectores a leer (algunos BIOS de Phoenix están limitados a un máximo de 127 sectores)
04h..07h 4 bytes segmento: puntero de desplazamiento al búfer de memoria al que se transferirán los sectores (tenga en cuenta que x86 es little-endian : si declara el segmento y el desplazamiento por separado, el desplazamiento debe declararse antes del segmento)
08h..0Fh 8 bytes número absoluto del inicio de los sectores que se leerán (el primer sector de la unidad tiene el número 0) usando el direccionamiento de bloque lógico (tenga en cuenta que la mitad inferior viene antes que la mitad superior)
Resultados
Registros Descripción
CF Establecer en caso de error, borrar si no hay error
AH Código de retorno

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

Parámetros
Registros Descripción
AH 43h = número de función para escritura extendida
Alabama
  • bit 0 = 0: cerrar comprobación de escritura,
  • bit 0 = 1: verificación de escritura abierta,
  • bit 1-7: reservado, puesto a 0
DL índice de unidad (por ejemplo, 1er disco duro = 80 h)
DS: SI segmento: puntero de desplazamiento al DAP
Resultados
Registros Descripción
CF Establecer en caso de error, borrar si no hay error
AH Código de retorno

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

Parámetros
Registros Descripción
AH 48h = número de función para Extended_read_drive_parameters
DL índice de unidad (por ejemplo, 1er disco duro = 80 h)
DS: SI segmento: puntero de desplazamiento al búfer de resultados, ver más abajo
Búfer de resultados
rango de compensación Talla descripción
00h..01h 2 bytes tamaño del búfer de resultados (establezca esto en 1Eh)
02h..03h 2 bytes banderas de información
04h..07h 4 bytes número físico de cilindros = último índice + 1
(porque el índice comienza con 0)
08h..0Bh 4 bytes número físico de cabezas = último índice + 1
(porque el índice comienza con 0)
0Ch..0Fh 4 bytes número físico de sectores por pista = último índice
(porque el índice comienza con 1)
10h..17h 8 bytes número absoluto de sectores = último índice + 1
(porque el índice comienza con 0)
18h .. 19h 2 bytes bytes por sector
1Ah..1Dh 4 bytes puntero opcional a los parámetros de configuración de la unidad de disco mejorada (EDD) que se pueden utilizar para las siguientes llamadas de extensión de 13 horas de interrupción (si se admiten)
Resultados
Registros Descripción
CF Establecer en caso de error, borrar si no hay error
AH Código de retorno

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

Parámetros
Inscritos Descripción
AH 4Bh = obtener el tipo de emulación de unidad
Alabama 01
DL índice de unidad (por ejemplo, 1er disco duro = 80 h)
DS: SI apunta a una estructura vacía para el resultado. debe tener un tamaño de 13 h
Resultados
Registros Descripción
CF Establecer en caso de error, borrar si no hay error
HACHA Código de retorno
DS: SI Apunta a una estructura de especificación
Estructura de especificación
Compensar Tamaño (byte) Descripción
00h 1 Tamaño de los paquetes en bytes (13h)
01h 1 Tipo de medio de arranque:
Bits
0-3 0000b: sin emulación

0001b: disquete de 1,2 M

0010b: disquete de 1,44 M

0011b: Disquete de 2,88 M

0100b: disco duro

4-5 Reservado
6 La imagen contiene el controlador ATAPI
7 La imagen contiene el controlador SCSI
02h 1 Número de unidad (índice de unidad)
03h 1 Número de controlador de CD-ROM
04h 4 Dirección de bloque lógico (LBA) de la imagen de disco para emular
08h 2 Especificación del dispositivo:

bit 0: el convertidor es esclavo en lugar de maestro

bits 7-0: LUN y PUN

0Ah 2 Segmento de búfer de 3K para almacenar en caché las lecturas de CD-ROM
0Ch 2 Segmento de imagen de arranque inicial a partir del segmento 7c0h
0Eh 2 Número de sectores (512 bytes de longitud) para cargar
10h 1 Byte bajo de conteo de cilindros (desde int 8h)
11h 1 Recuento de sectores (desde int 8h)
12h 1 Head Count (Desde int 8h)

Ver también

Referencias

enlaces externos