# Arquivo de dispositivo

Em sistemas operacionais, 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. Eles são comumente utilizados em sistemas operacionais do tipo Unix e também são encontrados no MS-DOS, OS/2 e Microsoft Windows. Os arquivos de dispositivo permitem que o software interaja com um driver de dispositivo utilizando as chamadas de sistema (system calls) padronizadas de entrada/saída, o que simplifica muitas tarefas e unifica mecanismos de E/S de espaço do usuário.
Frequentemente, os arquivos de dispositivo são utilizados como simples interfaces para dispositivos periféricos, como impressoras. Mas eles também podem ser usados para o acesso de recursos específicos nestes dispositivos, como partições em um disco. Finalmente, os arquivos de dispositivo são uteís para o acesso a recursos do sistema que não tem conexão com um dispositivo físico, como o /dev/null e geradores de números aleatórios.

## Sistemas Unix e do tipo Unix

Nós de dispositivo correspondem aos recursos que um núcleo de sistema operacional já alocou. O Unix identifica estes recursos por um número maior e um número menor, ambos armazenados como parte da estrutura de um nó. A designação destes números ocorrem de forma única em diferentes sistemas operacionais e sobre diferentes plataformas de computador. Geralmente, o número maior identifica o controlador (driver) do dispositivo e o menor identifica um dispositivo particular (possivelmente fora de muitos) que o driver controla: neste caso, o sistema pode passar o número menor ao driver. Entretanto, na presença da alocação de números dinâmica, este pode não ser o caso (e.g. no FreeBSD 5 em diante).

### Dispositivos de caractere

Arquivos especiais de caractere ou dispositivos de caractere fornecem acesso direto, e sem buffer, ao dispositivo de hardware. Eles não necessariamente permitem que os programas leiam ou escrevam caracteres individuais de cada vez, pois isso depende do dispositivo em questão. O dispositivo de caractere para um disco rígido, por exemplo, normalmente exigirá que todas as leituras e gravações sejam alinhadas aos limites de bloco e certamente não permitirá a leitura de um único byte.
Os 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 um pedaço de hardware baseado em bloco, normalmente exigirá que os programas leiam e gravem blocos alinhados.

### Dispositivos de bloco

Arquivos especiais de bloco ou dispositivos de bloco fornecem acesso armazenado em memória temporária (buffer) para dispositivos de hardware e fornecem alguma abstração de suas especificidades. Diferente de dispositivos de caractere, dispositivos de bloco sempre permitirão ao programador ler e escrever um bloco de qualquer tamanho (incluindo simples caracteres/bytes) e qualquer alinhamento. A desvantagem é que devido aos dispositivos de bloco serem armazenados em memória temporária, o programador não sabe quanto tempo levará antes que os dados escritos sejam passados das memórias temporárias do núcleo para o dispositivo real, ou mesmo em que ordem duas escritas separadas chegarão ao dispositivo físico. Além disso, se o mesmo hardware expõe tanto dispositivos de caractere quanto em bloco, há um risco de corrupção de dados devido aos clientes que utilizam o dispositivo de caractere não terem o conhecimento das alterações feitas na memória temporária (buffer) do dispositivo de bloco.
A maioria dos sistemas criam tanto dispositivos de bloco quanto de caractere para representar o hardware, como discos rígidos. O FreeBSD e o Linux notavelmente não fazem isso. O FreeBSD removeu o suporte para dispositivos de bloco, enquanto o Linux cria apenas dispositivos de bloco. No Linux, para obter um dispositivo de caractere para um disco deve-se usar o controlador (driver) "nativo" (raw), assim pode-se obter o mesmo efeito que abrir um dispositivo de caractere abrindo-se o dispositivo de bloco com a flag específica do Linux 0_DIRECT.

### Pseudo-dispositivos

Os nós de dispositivos em sistemas do tipo Unix não precisam necessariamente corresponder a dispositivos físicos. Os nós que não possuem essa correspondência formam o grupo de pseudo-dispositivos. Eles fornecem várias funções gerenciadas pelo sistema operacional. Alguns dos pseudo-dispositivos mais usados (baseados em caracteres) incluem:
* /dev/null - aceita e descarta todas as entradas. Não produz saída (sempre retorna uma indicação de fim de arquivo em uma leitura)
* /dev/zero - aceita e descarta todas as entradas. Produz um fluxo contínuo de bytes NUL (valor zero)
* /dev/full - produz um fluxo contínuo de bytes NUL (valor zero) quando lido e retorna uma mensagem "disco cheio" quando escrito
* /dev/random e /dev/urandom - eles produzem um fluxo de comprimento variável de números pseudo-aleatórios

### devfs

devfs é uma implementação específica de um sistema de arquivos de dispositivo em sistemas operacionais do tipo Unix, usada para apresentar arquivos de dispositivo. O mecanismo subjacente de implementação pode variar dependendo do SO.
Manter esses arquivos especiais em um sistema de arquivos implementado fisicamente (por exemplo, disco rígido) é inconveniente, e como ele precisa da assistência do kernel de qualquer maneira, a ideia surgiu de um sistema de arquivos lógico de propósito especial que não é armazenado fisicamente.
Definir, também, 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 a exclusão de entradas 'devfs' relacionadas aos dispositivos que ele ativa e desativa.

#### Implementações

| Sistema Operacional | Sistema de arquivos ou software de gerenciamento | Ponto de montagem padrão | Autor | Observações |
| Linux 2.3.46pre5–2.6.17 | devfsd | /dev | Richard Gooch | Implementado completamente no núcleo. Obsoleto - os usuários são encorajados a migrarem para o udev e/ou devtmpfs. |
| Linux 2.5– | udev em qualquer sistema de arquivos, mas normalmente em tmpfs | /dev | Greg Kroah-Hartman, Kay Sievers e Dan Stekloff | Implementado amplamente no espaço do usuário, as informações de dispositivo são reunidas a partir do sysfs. Arquivos de dispositivo podem ser armazenados em um sistema de arquivos de propósito geral, ou em um sistema de arquivos em memória (tmpfs). |
| Linux 2.6.32– | devtmpfs com ou sem udev | /dev | Kay Sievers, Jan Blunck, Greg Kroah-Hartman | Uma abordagem híbrida do kernel/espaço do usuário de um sistema de arquivos de dispositivo para fornecer nós antes do udev ser executado pela primeira vez |
| Solaris | | /devices | Sun Microsystems | Introduzido com controladores (drivers) carregados dinamicamente no Solaris-2.1 |
| FreeBSD 2.0– | devfs | /dev | Poul-Henning Kamp | Implementado completamente no núcleo. |
| DragonFly BSD 2.3.2– | devfs | /dev | Alex Hornung | Implementado completamente no núcleo. |
| macOS | devfs | /dev | Apple Inc. | Implementado completamente no núcleo. |
| HP-UX B.11.31 | devfs | /dev | HP | Implementado completamente no núcleo. |
| Plan 9 | | # | Bell Labs | Implementado no núcleo. |
| RISC OS | DeviceFS | Devices: | Acorn Computers | O DeviceFS foi iniciado em 1991 e apareceu pela primeira vez no RISC OS 3. Ele gerencia vários dispositivos, como arquivos especiais, mais comumente: Paralelo, Serial, FastParallel e USB. O módulo SystemDevices implementa os pseudo-dispositivos, como: Vdu, Kbd, Null e Printer. |
| MS-DOS, PC DOS, DR-DOS | FAT | \DEV (e /DEV) | vários | Conforme implementado no núcleo, os dispositivos de caracteres 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 somente em DEV. |
| MagiC, MiNT, MultiTOS | | U:\DEV | Application Systems Heidelberg, Eric R. Smith, Atari Corp. | A unidade especial U: contem um diretório DEV virtual, dentro do qual pode-se encontrar arquivos de dispositivo. |
| Windows 9x | | \\devices\ | Microsoft | |
| Windows NT | | \\.\ | Microsoft | O prefixo \\.\ faz com que as APIs de suporte acessem o espaço de nomes do dispositivo Win32 em vez do espaço de nomes do arquivo Win32. O espaço de nomes do dispositivo Win32, em si, vive em \Devices no espaço de nomes do NT. |

## MS-DOS

O MS-DOS emprestou o conceito de arquivos especiais do Unix, mas os renomeou para dispositivos. Devido ao fato de versões antigas do MS-DOS não suportarem hierarquia de diretórios, os dispositivos eram diferenciados dos arquivos regulares pelo uso de palavras reservadas para nomeá-los. Isto significa que certos nomes de arquivo são reservados para dispositivos, e não devem ser utilizados para nomear arquivos ou diretórios.
Os nomes reservados, por sua vez, foram criados para serem compatíveis com a manipulação de "arquivos especiais" por parte do comando PIP no CP/M.
Havia dois tipos de dispositivos no MS-DOS: Dispositivos de Bloco (usados para unidades de disco) e Dispositivos de Caractere (geralmente todos os outros dispositivos, incluindo dispositivos COM e PRN). O PIPE, MAILSLOT e MUP são outros padrões de dispositivos do Windows.

## DOS, TOS, OS/2 e Windows

Um arquivo de dispositivo é uma palavra-chave reservada usada nos sistemas DOS, TOS, OS/2 e Microsoft Windows para permitir acesso a certas portas e dispositivos.
O DOS usa arquivos de dispositivo para acessar impressoras e portas. A maioria das versões do Windows também contem este suporte, que pode causar confusão ao tentar criar arquivos e pastas de determinados nomes, quando eles não puderem possuir esses nomes. As versões 2.x do MS-DOS fornecem o parâmetro AVAILDEV do CONFIG.SYS que, se definido como FALSE, torna esses nomes especiais ativos apenas se prefixados com \DEV\, permitindo assim que arquivos ordinários sejam criados com esses nomes.
O GEMDOS, a parte derivada do DOS do Atari TOS, suportava nomes de dispositivos similares ao DOS, porém, diferente do DOS, era necessário um caractere ":" (no DOS, isto é opcional) para identificá-los como dispositivos, em oposição aos nomes de arquivos normais (desta forma, "CON:" funcionaria tanto no DOS quando no TOS, mas "CON" poderia nomear um arquivo ordinário no TOS, mas nomearia o dispositivo de console no DOS). No MiNT e no MagiC, uma visão especial do sistema de arquivos unificado do tipo Unix, acessada por meio da letra de unidade "U:", também colocava arquivos de dispositivo em "U:\DEV".
Alguns dos arquivos de dispositivo são listados abaixo:
| Nome do arquivo | propósito |
| CON | dispositivo de console |
| PRN | impressora |
| AUX | Dispositivo auxiliar |
| COM0 COM1 COM2 COM3 COM4 COM5 COM6 COM7 COM8 COM9 | portas seriais |
| LPT1 LPT2 PRN | portas paralelas |
| NUL | Bit bucket |
Uma palavra reservada não pode sequer ser utilizada como extensão de arquivo, os nomes de arquivo "nul.doc" e "con.html" são inválidos. Isto acaba confundindo usuários leigos e aborrecendo usuários técnicos.
A documentação da Microsoft se refere aos "arquivos de dispositivo MS-DOS" mesmo no sistema Windows NT, que não é baseado no MS-DOS.