INT 13H - INT 13H

INT 13h é uma abreviatura para BIOS interromper call 13 hex , o vigésimo vetor de interrupção em um sistema de computador baseado em x86 (IBM PC descendente). O BIOS normalmente configura um manipulador de interrupção de modo real neste vetor que fornece disco rígido baseado em setor e serviços de leitura e gravação de disquete usando endereçamento de setor de cabeça de cilindro (CHS). Os BIOSes de PC modernos também incluem funções de extensão INT 13h, originadas pela IBM e Microsoft em 1992, que fornecem os mesmos serviços de acesso a disco usando endereçamento LBA de 64 bits ; com pequenas adições, estes foram quase padronizados pela Phoenix Technologies e outros como extensões de BIOS EDD ( Enhanced Disk Drive ).

INT é uma instrução x86 que dispara uma interrupção de software e 13 hex é o número da interrupção (como um valor hexadecimal ) sendo chamado.

Os computadores modernos vêm com BIOS INT 13h e funcionalidade UEFI que fornece os mesmos serviços e muito mais, com exceção do UEFI Classe 3 que remove completamente o CSM, portanto, carece de INT 13h e outras interrupções. Normalmente, os drivers UEFI usam endereço LBA em vez de endereçamento CHS.

Visão geral

Em sistemas operacionais de modo real , como o DOS , chamar INT 13h saltaria para o código ROM-BIOS do computador para serviços de disco de baixo nível , que realizariam operações de leitura ou gravação de disco baseadas em setores físicos para o programa. No DOS, ele serve como interface de baixo nível para os drivers de dispositivo de bloco embutidos para discos rígidos e disquetes . Isso permite que o INT 25h e o INT 26h forneçam funções absolutas de leitura / gravação de disco para setores lógicos para o driver do sistema de arquivos FAT no kernel DOS, que lida com solicitações relacionadas a arquivos por meio de funções API DOS ( INT 21h ).

Em sistemas operacionais de modo protegido , como derivados do Microsoft Windows NT (por exemplo, NT4, 2000, XP e Server 2003) e Linux com DOSEMU , o SO intercepta a chamada e a passa para o mecanismo de I / O de disco nativo do sistema operacional. O Windows 9x e o Windows for Workgroups 3.11 também ignoram as rotinas do BIOS ao usar o Acesso ao disco de 32 bits . Além de realizar o acesso ao disco de baixo nível, chamadas INT 13h e estruturas de dados BIOS relacionadas também fornecem informações sobre os tipos e capacidades dos discos (ou outros dispositivos DASD ) anexados ao sistema; quando um sistema operacional de modo protegido é inicializado, ele pode usar essas informações do BIOS para enumerar o hardware do disco para que ele (o sistema operacional) possa carregar e configurar os drivers de E / S de disco apropriados.

A interface INT 13h de modo real do BIOS original oferece suporte a unidades de tamanhos de até 8 GB usando o que é comumente referido como endereçamento CHS físico . Esse limite se origina da interface de hardware do hardware de disco IBM PC / XT . O BIOS usou o endereço do setor da cabeça do cilindro (CHS) fornecido na chamada INT 13h e o transferiu diretamente para a interface de hardware. Um limite menor, cerca de 504 MB, foi imposto pela combinação dos limites de endereçamento CHS usados ​​pelo BIOS e aqueles usados ​​pelos discos rígidos ATA, que são diferentes. Quando os limites de endereçamento CHS de BIOS e ATA são combinados (ou seja, quando são aplicados simultaneamente), o número de setores de 512 bytes que podem ser endereçados representa um total de cerca de 504 MB.

O limite de 504 MB foi superado usando a tradução CHS , uma técnica pela qual o BIOS iria simular uma geometria CHS fictícia na interface INT 13h, enquanto se comunicava com o drive ATA usando sua geometria CHS lógica nativa. (No momento em que a barreira de 504 MB estava sendo abordada, os discos ATA muito antes haviam deixado de apresentar seus parâmetros geométricos físicos reais na interface ATA externa.) A tradução permite que o BIOS, ainda usando o endereçamento CHS, resolva efetivamente os discos ATA com tamanhos maiores para exatamente 8064 MB, a capacidade nativa da interface CHS do BIOS sozinha. (A interface ATA tem uma capacidade de endereçamento CHS nativo muito maior, então, uma vez que a "interferência" dos limites CHS do BIOS e ATA foi resolvida pelo endereçamento, apenas a limitação menor do BIOS foi significativa.) A tradução CHS às vezes é chamada de endereçamento CHS lógico , mas isso é realmente um nome impróprio, pois no momento do desenvolvimento do BIOS, os endereços CHS ATA já eram lógicos, não físicos. O limite de 8064 MB se origina de uma combinação da convenção de chamada baseada em valor de registro usada na interface INT 13h e o objetivo de manter a compatibilidade com versões anteriores - determinando que o formato ou tamanho dos endereços CHS passados ​​para INT 13h não poderiam ser alterados para adicionar mais bits para um dos campos, por exemplo, o campo do número do cilindro. Este limite usa 1024 cilindros, 256 cabeças, 63 setores e blocos de 512 bytes, permitindo exatamente 7,875 GiB de endereçamento (1024 * 256 * 63 * 512 bytes). Houve brevemente um número de BIOS que ofereceu versões incompatíveis desta interface - por exemplo, AWARD AT BIOS e AMI 386sx BIOS foram estendidos para lidar com até 4096 cilindros, colocando os bits 10 e 11 do número do cilindro nos bits 6 e 7 de registrar DH.

Todas as versões do MS-DOS , (incluindo MS-DOS 7 e Windows 95 ) têm um bug que impede a inicialização de unidades de disco com 256 cabeças (valor de registro 0xFF), então muitos BIOS modernos fornecem mapeamentos de tradução CHS com no máximo 255 (0xFE) cabeças , reduzindo assim o espaço endereçável total para exatamente 8032,5 MiB (aproximadamente 7,844 GiB).

Para suportar o endereçamento de discos ainda maiores, uma interface conhecida como INT 13h Extensions foi introduzida pela IBM e pela Microsoft, posteriormente publicada novamente e ligeiramente ampliada pela Phoenix Technologies como parte do BIOS Enhanced Disk Drive Services (EDD). Define novas funções dentro do serviço INT 13h, todas com números de função maiores que 40h, que utilizam endereçamento de bloco lógico (LBA) de 64 bits , que permite endereçar até 8 ZiB . (Uma unidade ATA também pode suportar LBA de 28 ou 48 bits, que permite até 128 GiB ou 128 PiB respectivamente, assumindo um tamanho de setor / bloco de 512 bytes). Esta é uma interface de "pacote", porque usa um ponteiro para um pacote de informações em vez da convenção de chamada baseada em registro da interface 13h original do INT. Este pacote é uma estrutura de dados muito simples que contém uma versão de interface, tamanho de dados e LBAs. Para compatibilidade com versões anteriores do software, as funções estendidas são implementadas junto com as funções CHS originais e as chamadas para funções de ambos os conjuntos podem ser misturadas, mesmo para a mesma unidade, com a ressalva de que as funções CHS não podem ultrapassar os primeiros 8064 MB do disco.

Alguns drivers de cache esvaziam seus buffers ao detectar que o DOS foi ignorado, emitindo diretamente o INT 13h dos aplicativos. Uma leitura simulada via INT 13h pode ser usada como um dos vários métodos para forçar a liberação de cache para caches desconhecidos (por exemplo, antes de reinicializar).

AMI BIOSes de cerca de 1990–1991 eliminam os buffers desalinhados de palavras. Alguns programas DOS e TSR substituem a habilitação de interrupção e os registros, de modo que o PC DOS e o MS-DOS instalam seus próprios filtros para evitar isso.

Lista de serviços INT 13h

Mesa do Drive
DL = 00h 1º disquete ("unidade A:")
DL = 01h 2º disquete ("unidade B:")
DL = 02h 3º disquete ("unidade B:")
. . .
DL = 7Fh 128º disquete
DL = 80h 1º disco rígido
DL = 81h 2º disco rígido
DL = 82h 3º disco rígido
. . .
DL = E0h CD / DVD ou 97º disco rígido
. . .
DL = FFh 128º disco rígido
Tabela de Função
AH = 00h   Reiniciar sistema de disco
AH = 01h   Obter status da última operação da unidade
AH = 02h   Ler Setores do Drive
AH = 03h   Grave Setores no Drive
AH = 04h   Verificar setores
AH = 05h   Formatar faixa
AH = 06h   Formato de faixa definir sinalizadores de setor inválidos
AH = 07h   Formatar o Drive começando na trilha
AH = 08h   Leia os parâmetros do drive
AH = 09h HD Inicializar o controlador de disco
AH = 0Ah HD Leia longos setores da unidade
AH = 0Bh HD Escreva longos setores para a unidade
AH = 0Ch HD Mova a cabeça de acionamento para o cilindro
AH = 0Dh HD Reiniciar unidades de disco
AH = 0Eh PS / 2 Teste de leitura do controlador
AH = 0Fh PS / 2 Teste de gravação de controlador
AH = 10h HD Teste se o Drive está pronto
AH = 11h HD Recalibrar unidade
AH = 12h PS / 2 Teste de RAM do controlador
AH = 13h PS / 2 Teste de acionamento
AH = 14h HD Diagnóstico de Controlador
AH = 15h   Ler tipo de unidade
AH = 16h FD Detectar mudança de mídia
AH = 17h FD Definir tipo de mídia para formato (usado por versões DOS <= 3.1)
AH = 18h FD Definir tipo de mídia para formato (usado por versões DOS> = 3.2)
AH = 19h   Park Heads
AH = 41h EXT Teste se as extensões estão disponíveis
AH = 42h EXT Ler Setores do Drive
AH = 43h EXT Grave Setores no Drive
AH = 44h EXT Verificar setores
AH = 45h EXT Bloquear / desbloquear unidade
AH = 46h EXT Ejetar unidade
AH = 47h EXT Mova o cabeçote da unidade para o setor
AH = 48h EXT Leia os parâmetros do drive
AH = 49h EXT Detectar mudança de mídia
AH = 4Bh EXT Obter tipo de emulação de unidade

Se a segunda coluna estiver vazia, a função pode ser usada tanto para disquete quanto para disco rígido.

  • FD: apenas para disquete.
  • HD: apenas para disco rígido.
  • PS / 2: para disco rígido no sistema PS / 2 apenas.
  • EXT: parte das extensões INT 13h que foram escritas na década de 1990 para oferecer suporte a discos rígidos com mais de 8 GB .

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

Parâmetros
AH 00h
DL Unidade (bit 7 definido significa redefinir os discos rígidos e flexíveis)
Resultados
CF Definido com erro
AH Código de retorno

INT 13h AH = 01h : Obter Status da Última Operação do Drive

Parâmetros
AH 01h
DL Dirigir

Bit 7 = 0 para unidade de disquete, bit 7 = 1 para unidade fixa

Resultados
AH
Código de retorno
00h Sucesso
01h Comando inválido
02h Não é possível encontrar a marca de endereço
03h Tentativa de gravação em disco protegido contra gravação
04h Setor não encontrado
05h Falha na redefinição
06h Linha de mudança de disco 'ativa'
07h Falha na atividade do parâmetro da unidade
08h DMA overrun
09h Tentativa de DMA acima do limite de 64kb
0 ah Setor defeituoso detectado
0Bh Cilindro (trilha) defeituoso detectado
0Ch Tipo de mídia não encontrado
0Dh Número inválido de setores
0Eh Marca de endereço de dados de controle detectada
0Fh DMA fora de alcance
10h Erro de dados CRC / ECC
11h Erro de dados corrigido ECC
20h Falha do controlador
40h Procure o fracasso
80h A unidade atingiu o tempo limite, presumido que não está pronto
AAh A unidade não está pronta
BBh Erro indefinido
CCh Falha de escrita
E0h Erro de status
FFh Falha na operação de detecção
CF Definir no erro, limpar se não houver erro

INT 13h AH = 02h : Ler Setores do Drive

Parâmetros
AH 02h
AL Setores para ler a contagem
CH Cilindro
CL Setor
DH Cabeça
DL Dirigir
ES: BX Ponteiro de endereço de buffer
Resultados
CF Definir no erro, limpar se não houver erro
AH Código de retorno
AL Contagem de leituras de setores reais

Observações

O registro CX contém o número do cilindro (10 bits , os valores possíveis são de 0 a 1023) e o número do setor (6 bits, os valores possíveis são de 1 a 63). Os bits de cilindro e setor são numerados abaixo:

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

Exemplos de tradução:

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;

O endereçamento do buffer deve garantir que o buffer completo esteja dentro de um determinado segmento , ou seja ( BX + size_of_buffer ) <= 10000h. Caso contrário, a interrupção pode falhar com algumas versões de BIOS ou hardware.

Exemplo

Suponha que você queira ler 16 setores (= 2000h bytes ) e seu buffer comece no endereço de memória 4FF00h. Utilizando a segmentação de memória , existem diferentes maneiras de calcular os valores de registro, por exemplo:

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

A função 02h da interrupção 13h só pode ler setores dos primeiros 16.450.560 setores do seu disco rígido, para ler setores além do limite de 8 GB você deve usar a função 42h das Extensões INT 13h . Outra alternativa pode ser a interrupção 25h do DOS, que lê setores dentro de uma partição.

Exemplo 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

após esta seção de código (com a qual o arquivo asm deve começar), você pode escrever o código e ele será carregado na memória e executado.

observe como não alteramos dl (a unidade). Isso ocorre porque quando o computador é carregado pela primeira vez, dl é definido como o número da unidade que foi inicializada, portanto, supondo que queremos ler a unidade de onde inicializamos, não há necessidade de alterar dl.

INT 13h AH = 03h : Gravar Setores no Drive

Parâmetros
AH 03h
AL Setores para escrever contagem
CH Acompanhar
CL Setor
DH Cabeça
DL Dirigir
ES: BX Ponteiro de endereço de buffer
Resultados
CF Definir no erro, limpar se não houver erro
AH Código de retorno
AL Contagem escrita dos setores reais

INT 13h AH = 04h : Verificar setores do inversor

Parâmetros
AH 04h
AL Setores para verificar a contagem
CH Acompanhar
CL Setor
DH Cabeça
DL Dirigir
ES: BX Ponteiro de endereço de buffer
Resultados
CF Definir no erro, limpar se não houver erro
AH Código de retorno
AL Contagem verificada de setores reais

INT 13h AH = 05h : Formatar faixa

Parâmetros
AH 05h
AL Setores para formatar a contagem
CH Acompanhar
CL Setor
DH Cabeça
DL Dirigir
ES: BX Ponteiro de endereço de buffer
Campo de endereço de 4 bytes
(aplica-se a PC / XT 286, AT, PS / 1 e PS / 2)
Byte Significado Valores Permitidos
1 Acompanhar
2 Cabeça
3 Setor
4 Bytes / Setor 0 = 128, 1-256, 2-512, 3-1024
Resultados
CF Definir no erro, limpar se não houver erro
AH Código de retorno

INT 13h AH = 06h : Formato Faixa Definir Sinalizadores de Setor Ruim

Parâmetros
AH 06h
AL Intercalar
CH Acompanhar
CL Setor
DH Cabeça
DL Dirigir
Resultados
CF Definir no erro, limpar se não houver erro
AH Código de retorno

INT 13h AH = 07h : Formatar a unidade começando na pista

Parâmetros
AH 07h
AL Intercalar
CH Acompanhar
CL Setor
DH Cabeça
DL Dirigir
Resultados
CF Definir no erro, limpar se não houver erro
AH Código de retorno

INT 13h AH = 08h : Ler Parâmetros do Drive

Parâmetros
Registros
AH 08h = número da função para read_drive_parameters
DL índice de unidade (por exemplo, 1º HDD = 80h)
ES: DI definido como 0000h: 0000h para contornar alguns BIOS com bugs
Resultados
CF Definir no erro, limpar se não houver erro
AH Código de retorno
DL número de unidades de disco rígido
DH último índice lógico de cabeças = numero_de - 1 (porque o índice começa com 0)
CX [7: 6] [15: 8] último índice lógico de cilindros = número_de - 1 (porque o índice começa com 0 )

[5: 0] último índice lógico de setores por trilha = numero_de (porque o índice começa com 1)

BL tipo de unidade (apenas disquetes AT / PS2)
ES: DI ponteiro para a tabela de parâmetros do drive (apenas para disquetes)

Observações

  • Os valores lógicos da função 08h podem / devem diferir dos valores físicos CHS da função 48h.
  • O registro de resultado CX contém os cilindros e os valores de setor / trilha, consulte a observação da função 02h.

INT 13h AH = 09h : Características do par de acionamento inicial

Parâmetros
AH 09h
DL Dirigir
Resultados
CF Definir no erro, limpar se não houver erro
AH Código de retorno

INT 13h AH = 0Ah: Ler Setores Longos do Drive

A única diferença entre esta função e a função 02h (veja acima) é que a função 0Ah lê 516 bytes por setor em vez de apenas 512. Os últimos 4 bytes contêm o Código de Correção de Erro (ECC), uma soma de verificação dos dados do setor.

INT 13h AH = 41h : Verificar extensões presentes

Parâmetros
Registros Descrição
AH 41h = número da função para verificação de extensões
DL índice de unidade (por exemplo, 1º HDD = 80h)
BX 55AAh
Resultados
Registros Descrição
CF Definido como não presente, claro se houver
AH Código de erro ou número da versão principal
BX AA55h
CX Interface com suporte a bitmask:
  • 1 - Acesso ao dispositivo usando a estrutura do pacote
  • 2 - Travamento e ejeção da unidade
  • 4 - Suporte aprimorado para unidade de disco (EDD)

INT 13h AH = 42h : Setores de leitura estendida da unidade

Parâmetros
Registros Descrição
AH 42h = número da função para leitura estendida
DL índice de unidade (por exemplo, 1º HDD = 80h)
DS: SI segmento: ponteiro de deslocamento para o DAP, veja abaixo
DAP: Pacote de Endereço de Disco
intervalo de deslocamento Tamanho Descrição
00h 1 byte tamanho do DAP (defina para 10h)
01h 1 byte não utilizado, deve ser zero
02h..03h 2 bytes número de setores a serem lidos, (alguns Phoenix BIOSes são limitados a um máximo de 127 setores)
04h..07h 4 bytes segmento: ponteiro de deslocamento para o buffer de memória para o qual os setores serão transferidos (observe que x86 é little-endian : se declarar o segmento e deslocamento separadamente, o deslocamento deve ser declarado antes do segmento)
08h..0Fh 8 bytes número absoluto do início dos setores a serem lidos (o primeiro setor da unidade tem o número 0) usando o endereçamento de bloco lógico (observe que a metade inferior vem antes da metade superior)
Resultados
Registros Descrição
CF Definir no erro, limpar se não houver erro
AH Código de retorno

Como já declarado com int 13h AH = 02h, deve-se tomar cuidado para garantir que o buffer completo esteja dentro do segmento dado , ou seja , (BX + size_of_buffer) <= 10000h

INT 13h AH = 43h : Setores de Gravação Estendida para Drive

Parâmetros
Registros Descrição
AH 43h = número da função para gravação estendida
AL
  • bit 0 = 0: fechar verificação de gravação,
  • bit 0 = 1: abrir verificação de gravação,
  • bit 1-7: reservado, definido como 0
DL índice de unidade (por exemplo, 1º HDD = 80h)
DS: SI segmento: ponteiro de deslocamento para o DAP
Resultados
Registros Descrição
CF Definir no erro, limpar se não houver erro
AH Código de retorno

INT 13h AH = 48h : Parâmetros de leitura estendidos da unidade

Parâmetros
Registros Descrição
AH 48h = número da função para extended_read_drive_parameters
DL índice de unidade (por exemplo, 1º HDD = 80h)
DS: SI segmento: ponteiro de deslocamento para o buffer de resultado, veja abaixo
Buffer de resultado
intervalo de deslocamento Tamanho Descrição
00h..01h 2 bytes tamanho do buffer de resultado (defina para 1Eh)
02h..03h 2 bytes bandeiras de informação
04h..07h 4 bytes número físico de cilindros = último índice + 1
(porque o índice começa com 0)
08h..0Bh 4 bytes número físico de cabeças = último índice + 1
(porque o índice começa com 0)
0Ch..0Fh 4 bytes número físico de setores por trilha = último índice
(porque o índice começa com 1)
10h..17h 8 bytes número absoluto de setores = último índice + 1
(porque o índice começa com 0)
18h..19h 2 bytes bytes por setor
1Ah..1Dh 4 bytes ponteiro opcional para parâmetros de configuração do Enhanced Disk Drive (EDD) que podem ser usados ​​para chamadas de extensão 13h de interrupção subsequentes (se houver suporte)
Resultados
Registros Descrição
CF Definir no erro, limpar se não houver erro
AH Código de retorno

Observação

Os valores físicos de CHS da função 48h podem / devem diferir dos valores lógicos da função 08h.

INT 13h AH = 4Bh: Obter tipo de emulação de unidade

Parâmetros
Regsiters Descrição
AH 4Bh = obter tipo de emulação de unidade
AL 01
DL índice de unidade (por exemplo, 1º HDD = 80h)
DS: SI aponta para uma estrutura vazia para o resultado. deve ter 13h de tamanho
Resultados
Registros Descrição
CF Definir no erro, limpar se não houver erro
MACHADO Código de retorno
DS: SI Aponta para uma estrutura de especificação
Estrutura de Especificação
Desvio Tamanho (byte) Descrição
00h 1 Tamanho dos pacotes em byte (13h)
01h 1 Tipo de mídia de inicialização:
Bits
0 - 3 0000b: sem emulação

0001b: disquete de 1,2M

0010b: disquete de 1,44M

0011b: disquete de 2,88M

0100b: Disco Rígido

4-5 Reservado
6 Imagem contém driver ATAPI
7 Imagem contém driver SCSI
02h 1 Número da unidade (índice da unidade)
03h 1 Número do controlador de CD-ROM
04h 4 Endereço de bloco lógico (LBA) da imagem de disco para emular
08h 2 Especificação do dispositivo:

bit 0: o drive é escravo em vez de mestre

bits 7-0: LUN e PUN

0 ah 2 Segmento de buffer de 3K para leituras de CD-ROMs em cache
0Ch 2 Segmento de imagem de inicialização inicial começando no segmento 7c0h
0Eh 2 Número de setores (512 bytes) para carregar
10h 1 Byte baixo de contagem de cilindros (de int 8h)
11h 1 Contagem do setor (de 8h int)
12h 1 Contagem de funcionários (a partir de 8h int)

Veja também

Referências

links externos