Interface: BlockDev Arquivos: blockdev.h Última atualização: 15/02/2004 Autor: Luiz Henrique Shigunov |
Descrição Estruturas |
Funções | |
0x01 - GetUnitDesc - Obtém a descrição de uma unidade 0x00 - GetUnitDescIndex - Obtém a descrição de uma unidade |
0x02 - Read - Lê blocos do dispositivo 0x03 - Write - Escreve blocos no dispositivo |
Esta página descreve a interface BlockDev que trata do acesso aos dispositivos de bloco.
Um dispositivo de bloco é aquele que lê/escreve em blocos de tamanho fixo e pode ler/escrever blocos de maneira não sequencial, ou seja, pode ler o bloco 1 e escrever o bloco 1000, por exemplo.
O número e o nome da unidade não precisam ser iguais sempre que o módulo é carregado (por exemplo quando o computador reinicia). Porém, seria bom que fossem iguais sempre que possível.
É por causa disso que um mecanismo de montar automaticamente os sistemas de arquivos quando o sistema inicia deve usar algum tipo de identificador do sistema de arquivos para saber em que disco o sistema de arquivos se encontra e não usar o número ou o nome da unidade já que eles podem mudar.
typedef struct { unsigned int unit; char *unitName; int type; int flags; unsigned int blockSize; unsigned int nBlocks; } BlockDev_UnitDesc;
Onde unit é o número da unidade, unitName o nome da unidade (string terminada com zero), type o tipo da unidade que pode ser:
flags é o OR (0x01 | 0x08, por exemplo) dos seguintes valores:
blockSize é o tamanho do bloco físico da unidade medido em bytes e é potência de 2 (1, 2, 4, 8, 16, ...) e nBlocks é a quantidade total de blocos na unidade.
blockSize e nBlocks podem ser zero em algumas condições. Por exemplo, se não existir um disquete na unidade de disquetes.
typedef struct { unsigned int unit; unsigned int block; unsigned int n; void *buffer; unsigned int done; } BlockDev_IO;
Onde unit é o número da unidade, block o bloco de início, n a quantidade de blocos, buffer a área que contém os dados ou será preenchida com os dados e done a quantidade de blocos processados.
Estas funções são de uso exclusivo dos módulos do sistema.
int BlockDev_GetUnitDesc(unsigned int unit, BlockDev_UnitDesc *unitDesc, unsigned int size, int prop);
Esta função obtém a descrição da unidade unit.
unitDesc é o ponteiro para a área que será preenchida com os dados da unidade e size é o tamanho dessa área.
prop deve ser o OR (0x01 | 0x08, por exemplo) dos seguintes valores:
O valor BlockDev_DO_NOT_READ é usado principalmente para unidades removíveis como o drive de disquete. Para essas unidades, é necessário ler a media para saber algumas informações como o tamanho da media, por exemplo.
O valor BlockDev_NO_NAME é útil para os módulos que não têm interesse em saber o nome da unidade e, assim, podem passar como tamanho o valor sizeof(BlockDev_UnitDesc).
int BlockDev_GetUnitDescIndex(unsigned int index, BlockDev_UnitDesc *unitDesc, unsigned int size, int prop);
Esta função obtém a descrição da unidade index, que começa com zero.
unitDesc é o ponteiro para a área que será preenchida com os dados da unidade e size é o tamanho dessa área.
prop deve ser o OR (0x01 | 0x08, por exemplo) dos seguintes valores:
O valor BlockDev_DO_NOT_READ é usado principalmente para unidades removíveis como o drive de disquete. Para essas unidades, é necessário ler a media para saber algumas informações como o tamanho da media, por exemplo.
O valor BlockDev_NO_NAME é útil para os módulos que não têm interesse em saber o nome da unidade e, assim, podem passar como tamanho o valor sizeof(BlockDev_UnitDesc).
int BlockDev_Read(BlockDev_IO *request);
Esta função lê n blocos, que tem que ser diferente de zero, da unidade unit começando de block inclusive. Os blocos lidos serão colocados em buffer.
A quantidade de blocos lidos será colocada em done.
Da estrutura request apenas o campo done será alterado. Os demais permanecerão inalterados.
int BlockDev_Write(BlockDev_IO *request);
Esta função escreve n blocos, que tem que ser diferente de zero, na unidade unit começando de block inclusive. Os dados serão lidos de buffer.
A quantidade de blocos escritos será colocada em done.
Da estrutura request apenas o campo done será alterado. Os demais permanecerão inalterados.