Como usar as extensões 13H INTERNAS na programação de C
Nós podemos chamar as funções de extensão de 13H INTERNO com as mesmas funções de C (int86 (), int86x () etc.), que nós usávamos nos capítulos mais adiantados. Deixar-nos aprendê-lo por um exemplo.
O seguinte exemplo dá o foco às três funções (as extensões da verificação atuais, lida prolongada e estendido escrevem). Entretanto nós não estamos indo ao uso estendido escrevemos a função neste capítulo.
Do programa as verificações se as extensões forem suportadas ou não se as extensões estiverem atuais para 13H INTERNO, primeiramente lê o setor absoluto 0 (assim MBR) do disco. O coding do programa prosegue na seguinte maneira:
/* Programa para alcançar setores além de 8.46 GB usando 13 extensões INTERNAS do BIOS */
#include<stdio.h>
#include<dos.h>
/* Assigns the identifier to the data type */
typedef unsigned char Byte;
typedef unsigned int Word;
typedef unsigned long DWord;
/* a estrutura do disk_packet é carregada no DS: O SI e o comando executaram */
struct disk_packet
{
Byte size_pack; // Size of packet must be 16 or 16+
Byte reserved1; // Reserved
Byte no_of_blocks;// Number of blocks for transfer
Byte reserved2; // Reserved
/* Address in Segment:Offset format */
Word offset; //offset address
Word segment; //segment address
/* Para suportar o disco mesmo da capacidade de
1152921504.607 GB */
DWord lba1;
DWord lba2;
}disk_pack;
/* Funcionar para verificar se as extensões forem suportadas */
void check_ext_present()
{
union REGS inregs, outregs; /* Input Registers and
Output */
inregs.h.ah=0x41; /* Function to Check
Extension Present */
inregs.x.bx=0x55AA;
inregs.h.dl=0x80; /* Drive No for first Hard Disk */
int86(0x13,&inregs,&outregs); /*Call interrupt */
if(outregs.x.cflag)
{
/* Extension Not Supported */
printf("\nBios extension not supported");
exit(1);
}
if(outregs.x.bx==0xAA55)
if(outregs.x.cx & 0x1)
/* Extension Present */
printf("\nExtended I/O supported");
}
/* Function to read the Sector */
void read_sectors(void *buffer)
{
union REGS inregs, outregs; /* Input and Output
Registers */
struct SREGS segregs; // Segment Registers
disk_pack.size_pack=16; // Set size to 16
disk_pack.no_of_blocks=1; // One block
disk_pack.reserved1=0; // Reserved Word
disk_pack.reserved2=0; // Reserved Word
disk_pack.segment=FP_SEG(buffer);// Segment of buffer
disk_pack.offset=FP_OFF(buffer); // Offset of buffer
/* request for MBR of hard disk 1 */
/* Read Absolute sector 0 */
disk_pack.lba1=0; /* LBA address, Contains first
32 bits */
/* We normally require( drives < 2.1 T.B) to set
only this */
disk_pack.lba2=0; // Last 32 bit address
inregs.h.ah=0x42; // Function to read
inregs.h.dl=0x80; // Drive Number for First Hard Disk inregs.x.si = FP_OFF(&disk_pack); /*Make DS:SI point
to disk_pack */
segregs.ds = FP_SEG(&disk_pack);
/* Call Interrupt */
int86x(0x13,&inregs,&outregs,&segregs);
if(outregs.x.cflag)
printf("\n\nError %d\n",outregs.h.ah);
else
printf("\n\nI hope Everything is all Right");
}
//// Write Sector Function \\\\
void write_sector()
{
/* Escrever-se-á na mesma maneira que os read_sectors funcionam, a não ser que o número da função, que será 0x43 nesta função. Nós discutiremos prolongado escrevemos a função em capítulos seguintes.
Antes de usar esta função por favor verificar e verificar o que são você que vai fazer. Você deve ter o conhecimento apropriado de o que você está indo fazer. O uso desta função na falta do conhecimento ou descuidada pode destruir seus dados. */
}
/// Main Function \\\\
void main()
{
int i=0;
/* buffer to hold MBR */
Byte mbr[512];
clrscr();
/* check for BIOS extension present */
check_ext_present();
/* read sector */
read_sectors(&mbr);
printf("\n\n Data of MBR \n");
printf("▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n\n\n");
while(i++<512)
{
/* display the MBR buffer */
printf("%c",mbr[i]);
}
}
Comentários no Coding do programa
o typedef atribui ao identificador ao tipo de dados tais que Byte não assinado do char do typedef; atribui o Byte do identificador para o tipo de dados char. A palavra do identificador é atribuída similarmente a interno e DWord é atribuído para long.
A estrutura do disk_packet é carregada no DS: O SI e o comando (tal como lida prolongada, estendido escrever ou verificar etc.) são executados. Ver as funções das extensões 13H INTERNAS de IBM/MS (função 41H a funcionar 49H) dadas antes.
The check_ext_present() verificações de função se as extensões forem disponíveis/suportadas ou não. A função é chamada com BX=55AAH (inregs.x.bx=0x55AA;) e se as extensões forem suportadas o registo de BX é ajustado a AA55H. (Ver a função 41H dada antes)
Os read_sectors da função são usados ler o setor absoluto do disco, especificado por disk_pack.lba1. Neste programa nós demos disk_pack.lba1=0, assim nós estamos indo ler o setor absoluto 0 (ver a nota abaixo) que vai assim ler o MBR do disco.
A função do write_sector é também mesma como os read_sectors funcionam e serão escritos na mesma maneira mas com as opções diferentes da função. Nós usá-la-emos nos capítulos seguintes.
Note:
Nós lemos os setores do disco nas seguintes duas maneiras:
- Setor relativo lido (ou escrever)
- O setor absoluto leu (ou escrever)
No setor relativo lido nós lemos os setores do disco de acordo com a geometria de CHS (cilindro, principal e setor) do disco. No setor relativo lido o MBR do disco (primeiro setor do disco) está no cilindro 0, na cabeça 0 e no setor 1.
Na leitura absoluta dos setores do disco, nós não necessitamos especificar o cilindro ou os números principais em nosso programa. Os setores absolutos são contados do setor absoluto 0.
Assim se nós estivermos indo ler o MBR do disco (primeiro setor do disco), nós estamos indo ler o setor absoluto 0. É o trabalho do BIOS para converter o número absoluto do setor a seu número correspondente do cilindro, o principal e do setor.
Como na leitura absoluta do setor (ou na escrita), nós temos que calcular somente os setores absolutos dentro do laço nas operações tais como a leitura inteira do disco ou a escrita, visto que em caso da leitura relativa do setor (ou da escrita), nós necessitamos funcionar três laços de cada vez para calcular a leitura/escrita absolutas do setor de CHS conseqüentemente é muito mais rápida do que a leitura/escrita relativas do setor.
Por exemplo, se nós tivermos qualquer disco duro com as 16 cabeças (lados), 12 cilindros e com 63 setores, a tabela dada em seguida, mostras o procedimento e diferença de ambos os métodos e assim mostras da leitura como a aproximação absoluta do setor pode fazer nosso tempo que faz exame de programas (tais como a escrita inteira da leitura do disco ou o disco inteiro que limpam os programas etc.) ao funcionamento muito mais rapidamente:
Leitura relativa dos setores |
Leitura absoluta do setor |
Cylinder =0, Head =0, Sector = 1 |
Absolute Sector = 0 |
Cylinder =0, Head =0, Sector = 2 |
Absolute Sector = 1 |
Cylinder =0, Head =0, Sector = 3 |
Absolute Sector = 2 |
.
.
.
. |
.
.
.
. |
Cylinder =0, Head =0, Sector = 62 |
Absolute Sector = 61 |
Cylinder =0, Head =0, Sector = 63 |
Absolute Sector = 62 |
Cylinder =0, Head =1, Sector = 1 |
Absolute Sector = 63 |
Cylinder =0, Head =1, Sector = 2 |
Absolute Sector = 64 |
Cylinder =0, Head =1, Sector = 3 |
Absolute Sector = 65 |
Cylinder =0, Head =1, Sector = 4 |
Absolute Sector = 66 |
.
.
.
. |
.
.
.
. |
Cylinder =0, Head =1, Sector = 63 |
Absolute Sector = 125 |
Cylinder =0, Head =2, Sector = 1 |
Absolute Sector = 126 |
Cylinder =0, Head =2, Sector = 2 |
Absolute Sector = 127 |
Cylinder =0, Head =2, Sector = 3 |
Absolute Sector = 128 |
.
.
.
. |
.
.
.
. |
Cylinder =0, Head =15, Sector = 63 |
Absolute Sector = 1007 |
Cylinder =1, Head =0, Sector = 1 |
Absolute Sector = 1008 |
Cylinder =1, Head =0, Sector = 2 |
Absolute Sector = 1009 |
Cylinder =1, Head =0, Sector = 3 |
Absolute Sector = 1010 |
.
.
.
. |
.
.
.
. |
Cylinder =1, Head =0, Sector = 63 |
Absolute Sector = 1070 |
Cylinder =1, Head =1, Sector = 1 |
Absolute Sector = 1071 |
Cylinder =1, Head =1, Sector = 2 |
Absolute Sector = 1072 |
Cylinder =1, Head =1, Sector = 3 |
Absolute Sector = 1073 |
.
.
.
. |
.
.
.
. |
Cylinder =1, Head =15, Sector = 63 |
Absolute Sector = 2015 |
Cylinder =2, Head =0, Sector = 1 |
Absolute Sector = 2016 |
Cylinder =2, Head =0, Sector = 2 |
Absolute Sector = 2017 |
Cylinder =2, Head =0, Sector = 3 |
Absolute Sector = 2018 |
.
.
.
. |
.
.
.
. |
Cylinder =11, Head =15, Sector = 60 |
Absolute Sector = 12092 |
Cylinder =11, Head =15, Sector = 61 |
Absolute Sector = 12093 |
Cylinder =11, Head =15, Sector = 62 |
Absolute Sector = 12094 |
Cylinder =11, Head =15, Sector = 63 |
Absolute Sector = 12095 |
A informação da tabela da divisória de MBR, que é indicado por todo o disco MBR que analisa a ferramenta, foi dada abaixo:
Na informação acima, os números relativos do setor para começar de ambas as divisórias são 63 e 11277630 respectivamente, que estão livres das divisórias e são contadas de acordo com o número dos setores, disponível no disco.
|