Dados gerais

Interface: BlockDev
Arquivos: blockdev.h
Última atualização: 15/02/2004
Autor: Luiz Henrique Shigunov
Informações

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

Descrição

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.

Estruturas

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.

Funções para o sistema

Estas funções são de uso exclusivo dos módulos do sistema.

0x01 - GetUnitDesc

Sintaxe

int BlockDev_GetUnitDesc(unsigned int unit, BlockDev_UnitDesc *unitDesc, unsigned int size, int prop);

Propriedades

Descrição

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).

Valor de retorno

0x00 - GetUnitDescIndex

Sintaxe

int BlockDev_GetUnitDescIndex(unsigned int index, BlockDev_UnitDesc *unitDesc, unsigned int size, int prop);

Propriedades

Descrição

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).

Valor de retorno

0x02 - Read

Sintaxe

int BlockDev_Read(BlockDev_IO *request);

Propriedades

Descrição

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.

Valor de retorno

0x03 - Write

Sintaxe

int BlockDev_Write(BlockDev_IO *request);

Propriedades

Descrição

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.

Valor de retorno