(O que se segue está simplificado demais, mas deve lhe dar uma ideia geral)
O dispositivo é uma peça de hardware diretamente conectada à CPU (rara, a menos que seja um barramento) ou indiretamente conectada por meio de um barramento (que é em si um dispositivo). Os dispositivos podem se comunicar com a CPU usando qualquer um dos quatro métodos: endereços de memória, endereços de E / S, canais DMA e IRQs. (A idade em que você teve que se preocupar com isso já passou há muito tempo, ele morreu com a ISA).
Uma das razões pelas quais temos sistemas operacionais é fornecer uma interface comum para conversar com tipos de hardware. Assim, aqueles que escrevem programas podem usar essa interface comum em vez de conhecer os detalhes de baixo nível de cada dispositivo específico. Isso torna a programação mais rápida e fácil.
O driver é um software que apresenta essa interface comum para o lado do aplicativo e converte solicitações usando essa interface para um formulário que o dispositivo pode manipular (usando os endereços de memória, endereços de E / S, DMA e IRQs mencionados anteriormente , ou possivelmente chamando outros drivers), e de volta.
O Linux, sendo um sistema operacional no estilo UNIX, usa uma "interface comum" específica chamada API do UNIX. Um objetivo de design do UNIX é fazer com que tudo pareça um arquivo. As operações que você pode executar em arquivos são: criar, ler, escrever, procurar e fechar. Para coisas que não se encaixam perfeitamente nesses conceitos, há outra operação chamada ioctl que é uma espécie de "pega-tudo" para todo o resto.
Se você emitir solicitações para essas operações em um arquivo de dispositivo, as solicitações não irão para a camada do sistema de arquivos do kernel, mas diretamente para o dispositivo.
Agora, você tem arquivos de dispositivo que permitem falar com dispositivos de armazenamento em um nível baixo (/ dev / sda, etc.), mas os dispositivos de armazenamento são realmente estúpidos. Tudo o que eles podem fazer através da API do UNIX é fornecer um bloco ou LBA de dados (512, 2048 ou 4096 bytes) ou armazená-los (os discos rígidos modernos têm dezenas de milhões de LBAs, se não mais). Eles não organizam em arquivos por si mesmos. Por exemplo, gravar em um arquivo pode envolver a gravação em muitos LBAs e você precisa de um sistema para controlar quais LBAs pertencem a qual arquivo. Esse é o trabalho da camada do sistema de arquivos do kernel, traduzindo solicitações de operações em arquivos para solicitações de operações em dispositivos e usando parte do armazenamento desse dispositivo para rastrear tudo.
A camada do sistema de arquivos é o que implementa todo o sistema de diretórios. É uma estrutura de árvore e você pode anexar ou montar dispositivos de bloco em vários pontos dessa árvore. A camada do sistema de arquivos precisa saber qual dispositivo de "baixo nível" tem arquivos, e é por isso que você precisa montá-lo.