Arquivo do dispositivo - Device file

Em sistemas operacionais semelhantes ao Unix , um arquivo de dispositivo ou arquivo especial é uma interface para um driver de dispositivo que aparece em um sistema de arquivos como se fosse um arquivo comum . Também existem arquivos especiais no DOS , OS / 2 e Windows . Esses arquivos especiais permitem que um programa aplicativo interaja com um dispositivo usando seu driver de dispositivo por meio de chamadas de sistema de entrada / saída padrão . O uso de chamadas de sistema padrão simplifica muitas tarefas de programação e leva a mecanismos de E / S consistentes do espaço do usuário, independentemente dos recursos e funções do dispositivo.

Os arquivos de dispositivo geralmente fornecem interfaces simples para dispositivos padrão (como impressoras e portas seriais), mas também podem ser usados ​​para acessar recursos exclusivos específicos nesses dispositivos, como partições de disco . Além disso, os arquivos do dispositivo são úteis para acessar recursos do sistema que não têm conexão com nenhum dispositivo real, como coletores de dados e geradores de números aleatórios .

Existem dois tipos gerais de arquivos de dispositivo em sistemas operacionais do tipo Unix, conhecidos como arquivos especiais de caracteres e arquivos especiais de bloqueio . A diferença entre eles está na quantidade de dados lidos e gravados pelo sistema operacional e hardware. Juntos, esses arquivos podem ser chamados de arquivos especiais de dispositivo, em contraste com canais nomeados , que não estão conectados a um dispositivo, mas também não são arquivos comuns.

O MS-DOS pegou emprestado o conceito de arquivos especiais do Unix, mas os renomeou como dispositivos . Como as versões anteriores do MS-DOS não suportavam uma hierarquia de diretórios , os dispositivos eram diferenciados dos arquivos regulares tornando seus nomes palavras reservadas , por exemplo: o infame CON. Eles foram escolhidos por um grau de compatibilidade com CP / M e ainda estão presentes no Windows moderno para compatibilidade com versões anteriores.

Em alguns sistemas semelhantes ao Unix, a maioria dos arquivos de dispositivos são gerenciados como parte de um sistema de arquivos virtual tradicionalmente montado em /dev, possivelmente associado a um daemon de controle, que monitora a adição e remoção de hardware em tempo de execução, fazendo alterações correspondentes no sistema de arquivos do dispositivo, se isso não é feito automaticamente pelo kernel e, possivelmente, invocando scripts no sistema ou no espaço do usuário para lidar com as necessidades especiais do dispositivo. O FreeBSD , DragonFly BSD e Darwin têm um sistema de arquivos dedicado devfs ; os nós do dispositivo são gerenciados automaticamente por este sistema de arquivos, no espaço do kernel . O Linux costumava ter uma implementação devfs semelhante , mas foi abandonado mais tarde e removido desde a versão 2.6.17; O Linux agora usa principalmente uma implementação de espaço do usuário conhecida como udev , mas existem muitas variantes.

Em sistemas Unix que suportam o isolamento do processo chroot , como Solaris Containers , normalmente cada ambiente chroot precisa do seu próprio /dev; esses pontos de montagem serão visíveis no sistema operacional host em vários nós na árvore do sistema de arquivos global. Ao restringir os nós de dispositivo populados em instâncias chroot de /dev, o isolamento de hardware pode ser reforçado pelo ambiente chroot (um programa não pode interferir em hardware que não pode ver nem nomear - uma forma ainda mais forte de controle de acesso do que as permissões do sistema de arquivos Unix ).

Contenção de dispositivo de hardware gerenciado por MS-DOS (consulte TSR ) tornando cada arquivo de dispositivo aberto exclusivo. Um aplicativo que tenta acessar um dispositivo já em uso se descobriria incapaz de abrir o nó do arquivo do dispositivo. Uma variedade de semânticas de driver de dispositivo são implementadas em Unix e Linux em relação ao acesso simultâneo .

Unix e sistemas semelhantes ao Unix

Uma estrutura simplificada do kernel Linux. Os sistemas de arquivos são implementados como parte do subsistema de E / S.

Os nós de dispositivo correspondem a recursos que o kernel de um sistema operacional já alocou. O Unix identifica esses recursos por um número principal e um número secundário , ambos armazenados como parte da estrutura de um . A atribuição desses números ocorre exclusivamente em diferentes sistemas operacionais e em diferentes plataformas de computador . Geralmente, o número principal identifica o driver do dispositivo e o número menor identifica um dispositivo específico (possivelmente entre muitos) que o driver controla: neste caso, o sistema pode passar o número menor para um driver. No entanto, na presença de alocação dinâmica de números , este pode não ser o caso (por exemplo, no FreeBSD 5 e superior).

Tal como acontece com outros tipos de arquivos especiais, o sistema de computador acessa nós de dispositivo usando chamadas de sistema padrão e os trata como arquivos de computador normais. Existem dois tipos padrão de arquivos de dispositivo; infelizmente seus nomes são um tanto contra-intuitivos por razões históricas, e as explicações da diferença entre os dois são freqüentemente incorretas como resultado.

Dispositivos de personagem

Arquivos especiais de caracteres ou dispositivos de caracteres fornecem acesso direto e sem buffer ao dispositivo de hardware. Eles não permitem necessariamente que os programas leiam ou gravem caracteres únicos por vez; isso depende do dispositivo em questão. O dispositivo de caractere de um disco rígido, por exemplo, normalmente exigirá que todas as leituras e gravações estejam alinhadas aos limites do bloco e certamente não permitirá a leitura de um único byte.

Dispositivos de caractere às vezes são conhecidos como dispositivos brutos para evitar a confusão em torno do fato de que um dispositivo de caractere para uma peça de hardware baseado em bloco normalmente requer programas para ler e escrever blocos alinhados.

Dispositivos de bloqueio

Bloquear arquivos especiais ou dispositivos de bloco fornecem acesso em buffer a dispositivos de hardware e fornecem alguma abstração de suas especificações. Ao contrário dos dispositivos de caracteres, os dispositivos de bloco sempre permitirão ao programador ler ou gravar um bloco de qualquer tamanho (incluindo caracteres / bytes únicos) e qualquer alinhamento. A desvantagem é que, como os dispositivos de bloco são armazenados em buffer, o programador não sabe quanto tempo levará antes que os dados gravados sejam passados ​​dos buffers do kernel para o dispositivo real, ou mesmo em que ordem duas gravações separadas chegarão ao dispositivo físico. Além disso, se o mesmo hardware expõe dispositivos de caractere e bloco, há o risco de corrupção de dados devido aos clientes que usam o dispositivo de caractere não estarem cientes das alterações feitas nos buffers do dispositivo de bloco.

A maioria dos sistemas cria dispositivos de bloco e de caractere para representar hardware como discos rígidos. Notavelmente, FreeBSD e Linux não; o primeiro removeu o suporte para dispositivos de bloco, enquanto o último cria apenas dispositivos de bloco. No Linux, para obter um dispositivo de caractere para um disco, deve-se usar o driver "bruto", embora seja possível obter o mesmo efeito de abrir um dispositivo de caractere abrindo o dispositivo de bloco com o O_DIRECTsinalizador específico do Linux .

Pseudo-dispositivos

Os nós de dispositivo em sistemas semelhantes ao Unix não precisam necessariamente corresponder a dispositivos físicos . Os nós que carecem dessa correspondência formam o grupo de pseudo-dispositivos . Eles fornecem várias funções gerenciadas pelo sistema operacional. Alguns dos pseudo-dispositivos mais comumente usados ​​(baseados em caracteres) incluem:

  • / dev / null  - aceita e descarta todas as entradas gravadas nele; fornece umaindicação de fim de arquivo durante a leitura.
  • / dev / zero  - aceita e descarta todas as entradas gravadas nele; produz um fluxo contínuo de caracteres nulos (bytes de valor zero) como saída quando lidos.
  • / dev / full  - produz um fluxo contínuo de caracteres nulos (bytes de valor zero) como saída quando lido e gera umerro ENOSPC ("disco cheio") ao tentar gravar nele.
  • / dev / random  - produz bytes gerados pelo gerador de números pseudo-aleatórios criptograficamente seguro do kernel. Seu comportamento exato varia de acordo com a implementação e, às vezes, variantes como / dev / urandom ou / dev / arandom também são fornecidas.

Além disso, pseudo-dispositivos específicos de BSD com uma interface ioctl também podem incluir:

Criação de nó

Os nós são criados pela chamada de sistema mknod . O programa de linha de comando para criar nós também é chamado de mknod. Os nós podem ser movidos ou excluídos pelas chamadas usuais do sistema de arquivos ( renomear , desvincular ) e comandos ( mv , rm ).

Algumas versões do Unix incluem um script chamado makedev ou MAKEDEV para criar todos os dispositivos necessários no diretório /dev. Só faz sentido em sistemas cujos dispositivos são atribuídos estaticamente a números principais (por exemplo, por meio de codificação permanente em seu módulo de kernel).

Enquanto alguns outros sistemas Unix, como o FreeBSD , usavam gerenciamento de nó de dispositivo baseado em kernel via devfs apenas, e não suportando a criação manual de nó. A chamada de sistema mknod (2) e o comando mknod (8) existem para manter a compatibilidade com POSIX, mas os nós de dispositivos criados manualmente fora do devfs não funcionarão de forma alguma.

Convenções de nomenclatura

Os seguintes prefixos são usados ​​para os nomes de alguns dispositivos na /devhierarquia, para identificar o tipo de dispositivo:

Alguns prefixos adicionais passaram a ser usados ​​normalmente em alguns sistemas operacionais:

  • fb: buffer de quadro
  • fd: (plataforma) disquetes , embora esta mesma abreviatura também seja comumente usada para se referir ao descritor de arquivo
  • hd: (“Clássico”) driver IDE (usado anteriormente para unidade de disco rígido ATA , unidades de disco óptico ATAPI , etc.)
    • hda: o dispositivo mestre no primeiro canal ATA (geralmente identificado pelo número principal 3 e pelo número secundário 0)
    • hdb: o dispositivo escravo no primeiro canal ATA
    • hdc: o dispositivo mestre no segundo canal ATA
    • hdd: o dispositivo escravo no segundo canal ATA
  • parport, pp: portas paralelas
  • mem: Memória principal (dispositivo de personagem)
  • Driver NVMe
    • nvme0: primeiro controlador de dispositivo registrado (dispositivo de personagem)
    • nvme0n1: primeiro namespace do dispositivo registrado (dispositivo de bloco)
    • nvme0n1p1: primeira partição do primeiro namespace do dispositivo registrado (dispositivo de bloco)
  • Driver MMC
    • mmcblk: driver de armazenamento para MMC Media ( cartões SD , chips eMMC em laptops, etc.)
      • mmcblk0: primeiro dispositivo registrado
      • mmcblk0p1: primeira partição do primeiro dispositivo registrado
  • Driver SCSI , também usado por libATA ( driver PATA / SATA moderno ), USB , IEEE 1394 , etc.
    • sd: driver de armazenamento em massa (dispositivo de bloco)
      • sda: primeiro dispositivo registrado
      • sdb, sdc, etc: segundo, terceiro, etc. dispositivos registrados
    • ses: Motorista de gabinete
    • sg: camada SCSI genérica
    • sr: Driver "ROM" (unidades de disco óptico orientadas a dados; scd é apenas um alias secundário)
    • st: driver de fita magnética
  • tty: terminais
    • ttyS: (plataforma) driver de porta serial
    • ttyUSB: Conversores seriais USB, modems, etc.

A lista canônica dos prefixos usados ​​no Linux pode ser encontrada na Lista de dispositivos Linux, o registro oficial de números de dispositivos alocados e /devnós de diretório para o sistema operacional Linux.

Para a maioria dos dispositivos, esse prefixo é seguido por um número que identifica exclusivamente o dispositivo específico. Para discos rígidos, uma letra é usada para identificar os dispositivos e é seguida por um número para identificar as partições . Assim, um sistema de arquivos pode "conhecer" uma área em um disco como /dev/sda3, por exemplo, ou "ver" uma sessão de terminal em rede associada a /dev/pts/14.

Em discos que usam o registro mestre de inicialização típico do PC , os números dos dispositivos da partição primária e da partição estendida opcional são numerados de 1 a 4, enquanto os índices de quaisquer partições lógicas são 5 e posteriores, independentemente do layout das partições anteriores (seu pai estendido partição não precisa ser a quarta partição do disco, nem todas as quatro partições primárias precisam existir).

Nomes de dispositivos geralmente não são portáveis ​​entre diferentes variantes de sistema do tipo Unix, por exemplo, em alguns sistemas BSD , os dispositivos IDE são nomeados / dev / wd0, / dev / wd1, etc.

devfs

devfs é uma implementação específica de um sistema de arquivo de dispositivo em sistemas operacionais do tipo Unix, usado para apresentar arquivos de dispositivo. O mecanismo de implementação subjacente pode variar, dependendo do sistema operacional.

Manter esses arquivos especiais em um sistema de arquivos fisicamente implementado (ou seja, disco rígido) é inconveniente e, como ele precisa da assistência do kernel de qualquer maneira, surgiu a ideia de um sistema de arquivos lógico de propósito especial que não é armazenado fisicamente.

Além disso, definir quando os dispositivos estão prontos para aparecer não é totalmente trivial. A abordagem 'devfs' é para o driver de dispositivo solicitar a criação e exclusão de entradas 'devfs' relacionadas aos dispositivos que ele habilita e desabilita.

PC DOS, TOS, OS / 2 e Windows

Um arquivo de dispositivo é uma palavra-chave reservada usada em sistemas PC DOS , TOS , OS / 2 e Windows para permitir o acesso a certas portas e dispositivos.

O MS-DOS pegou emprestado o conceito de arquivos especiais do Unix, mas os renomeou como dispositivos . Como as versões anteriores do MS-DOS não suportavam uma hierarquia de diretórios , os dispositivos foram diferenciados dos arquivos regulares tornando seus nomes palavras reservadas . Isso significa que certos nomes de arquivo foram reservados para dispositivos e não devem ser usados ​​para nomear novos arquivos ou diretórios. Os nomes reservados próprios foram escolhidos para ser compatível com "arquivos especiais" de manipulação de PIPcomando no CP / M . Havia dois tipos de dispositivos no DOS: Dispositivos de bloco (usados ​​para unidades de disco) e Dispositivos de caracteres (geralmente todos os outros dispositivos, incluindo dispositivos COM e PRN).

O DOS usa arquivos de dispositivo para acessar impressoras e portas. A maioria das versões do Windows também contém esse suporte, o que pode causar confusão ao tentar criar arquivos e pastas com determinados nomes, pois eles não podem ter esses nomes. As versões 2.x do MS-DOS fornecem o parâmetro AVAILDEV CONFIG.SYS que, se definido como FALSE, torna esses nomes especiais ativos apenas se prefixados com \DEV\, permitindo assim que arquivos comuns sejam criados com esses nomes.

GEMDOS , a parte semelhante ao DOS do Atari TOS , suportava nomes de dispositivos semelhantes ao DOS, mas, ao contrário do DOS, exigia um caractere ":" à direita (no DOS, isso é opcional) para identificá-los como dispositivos em oposição aos nomes de arquivos normais (portanto, " CON: "funcionaria no DOS e no TOS, mas" CON "nomearia um arquivo comum no TOS, mas o dispositivo do console no DOS). No MiNT e no MagiC , uma visão especial do sistema de arquivos unificado semelhante ao UNIX, acessada por meio da letra da unidade "U:", também colocava os arquivos do dispositivo em "U: \ DEV".

Palavra-chave do dispositivo Use como entrada Use como saída
VIGARISTA Recebe dados digitados até que ^ Z (Ctrl-Z) seja pressionado. Imprime dados no console.
PRN N / D Imprime texto na impressora, geralmente redirecionado para LPT1 ou LST . Às vezes reconfigurável para outros dispositivos.
AUX (não em OS / 2) Lê dados de um dispositivo auxiliar, geralmente um dispositivo serial como COM1 . Às vezes reconfigurável para outros dispositivos. Envia dados para um dispositivo auxiliar, geralmente um dispositivo serial como COM1 . Às vezes reconfigurável para outros dispositivos.
NUL Retorna nulo ou nenhum dado. Descarta os dados recebidos.
CLOCK $ (ainda denominado CLOCK em algumas versões do MS-DOS 2.11) N / D N / D
KEYBD $ (apenas em multitarefa MS-DOS ) ? ?
KBD $ (apenas em OS / 2 ) ? ?
SCREEN $ (apenas em multitarefa MS-DOS e OS / 2) ? ?
POINTER $ (apenas em OS / 2) ? ?
MOUSE $ (apenas em OS / 2) ? ?
$ IDLE $ (apenas nas famílias DR-DOS (desde 5.0) e DOS multiusuário (desde Concurrent DOS 386 )) N / D N / D
CONFIG $ (apenas no MS-DOS 7.0 e superior) N / D N / D
LST (apenas em 86-DOS e DOS 1.x, também no MS-DOS 2.11 da Hewlett-Packard para o HP Portable Plus ) Não retorna dados. Envia dados para a impressora de linha. (LPT2 para MS-DOS 2.11 da Hewlett-Packard)
PLT (somente no MS-DOS 2.11 da Hewlett-Packard para o HP Portable Plus ) Não retorna dados. Envia dados para o plotter atribuído . O dispositivo de plotadora anexado é reconfigurável.
LPT1 , LPT2 , LPT3 e às vezes LPT4 (no DR-DOS 7.02 e superior e algumas versões do DOS multiusuário) N / D Envia dados para a porta paralela selecionada.
COM1 , COM2 , COM3 , COM4 Lê dados da porta serial selecionada. Envia dados para a porta serial selecionada.
82164A (apenas no MS-DOS 2.11 da Hewlett-Packard para o HP Portable Plus ) Redireciona para COM2. Redireciona para COM2.

Usando redirecionamento de shell e pipes, os dados podem ser enviados ou recebidos de um dispositivo. Por exemplo, digitar o seguinte enviará o arquivo c:\data.txtpara a impressora:

TYPE c:\data.txt > PRN

PIPE, MAILSLOT e MUP são outros dispositivos padrão do Windows.

IOCS

O sistema operacional de 8 bits dos computadores de bolso Sharp como o PC-E500 , PC-E500S etc. consiste em um interpretador BASIC , um Sistema de Controle de Arquivos (FCS) semelhante ao DOS 2 implementando um sistema de arquivos semelhante ao FAT de 12 bits rudimentar e um sistema de controle de entrada / saída semelhante a BIOS (IOCS) implementando uma série de caracteres padrão e drivers de dispositivo de bloco, bem como dispositivos de arquivo especiais, incluindo STDO: / SCRN: (exibição), STDI: / KYBD: (teclado), COM: ( E / S serial), STDL: / PRN: (impressora), CAS: (fita cassete), E: / F: / G: (arquivo de memória), S1: / S2: / S3: (cartão de memória), X: / Y: (disquete), SYSTM: (sistema) e NIL: (função).

Implementações

Sistema operacional Sistema de arquivos ou software de gerenciamento Ponto de montagem padrão Autor Notas
Linux 2.3.46pre5-2.6.17 devfs e devfsd /dev Richard Gooch Implementado totalmente no kernel, com daemon devfsd opcional para lidar com eventos de nó de dispositivo no espaço do usuário. Obsoleto - os usuários são encorajados a migrar para udev e / ou devtmpfs .
Linux 2.5– udev em qualquer fs, mas geralmente tmpfs /dev Greg Kroah-Hartman , Kay Sievers e Dan Stekloff Implementado amplamente no espaço do usuário, as informações do dispositivo são coletadas do sysfs . Os arquivos do dispositivo podem ser armazenados em um sistema de arquivos de uso geral convencional ou em um sistema de arquivos de memória ( tmpfs ).
Linux 2.6.32– devtmpfs com ou sem udev /dev Kay Sievers , Jan Blunck, Greg Kroah-Hartman Uma abordagem híbrida de kernel / espaço do usuário de um sistema de arquivos de dispositivo para fornecer nós antes que o udev seja executado pela primeira vez
Solaris devfs /devices Sun Microsystems Introduzido com drivers carregados dinamicamente no Solaris-2.1
FreeBSD 2.0– devfs /dev Poul-Henning Kamp Totalmente implementado no kernel.
DragonFly BSD 2.3.2– devfs /dev Alex Hornung Totalmente implementado no kernel.
Mac OS devfs /dev Apple Inc. Totalmente implementado no kernel.
HP-UX B.11.31 devfs /dev HP Totalmente implementado no kernel.
Plano 9 # Bell Labs Implementado no kernel.
RISC OS DeviceFS Devices: Computadores Acorn DeviceFS foi iniciado em 1991 e apareceu pela primeira vez no RISC OS 3. Ele gerencia vários dispositivos como arquivos especiais, mais comumente: Parallel, Serial, FastParallel e USB. O módulo SystemDevices implementa os pseudo dispositivos como: Vdu, Kbd, Null e Printer.
MS-DOS , PC DOS , DR-DOS GORDURA \DEV(e /DEV) vários Conforme implementado no kernel, os dispositivos de caractere aparecem no diretório virtual \ DEV e em qualquer diretório de disco. No MS-DOS / PC DOS 2.x, a diretiva CONFIG.SYS AVAILDEV = FALSE pode ser usada para forçar a existência de dispositivos apenas em \ DEV.
MagiC , MiNT , MultiTOS U:\DEV Sistemas de aplicação Heidelberg, Eric R. Smith, Atari Corp. A unidade U: especial contém um diretório DEV virtual, dentro do qual se podem encontrar arquivos de dispositivo.
Windows 9x \\devices\ Microsoft
Windows NT \Device Microsoft O \Devicediretório faz parte do namespace de objeto do Windows NT.
Subsistema Win32 do Windows NT \\.\ Microsoft O \\.\prefixo faz com que as APIs de suporte acessem o namespace do dispositivo Win32 em vez do namespace do arquivo Win32. Os nomes de dispositivos Win32 são links simbólicos para nomes de dispositivos no \Devicediretório do Windows NT .

Veja também

Referências

Leitura adicional