Por que /dev e /proc/devices têm saídas totalmente diferentes no Linux

Por que /dev e /proc/devices têm saídas totalmente diferentes no Linux

Até onde sei:

  • Um driver pode estar relacionado a um ou mais “dispositivos”.

  • Os arquivos em /dev representam esses dispositivos. O driver possui um número maior e cada dispositivo também possui um número menor, portanto (maior, menor) identifica um dispositivo.

  • /proc/devices também lista os dispositivos.

Se o que eu sei é verdade então:

Por que /dev e /proc/devices têm saídas totalmente diferentes? Em dev existe o nome do dispositivo, número maior e número menor. E em /proc/devices há um número maior e um nome de dispositivo, mas não um número menor. Por que essas duas listas mostram resultados totalmente diferentes, mesmo para o mesmo número principal?

Por exemplo, veja esta linha em ls -l /dev

crw------- 1 root root     10, 235 Sep 19 21:40 autofs

É um dispositivo de caractere com número maior 10 e número menor 235. O nome do dispositivo é autofs.

Agora verifico a entrada com o mesmo número principal em/proc/devices:

10 misc

Como você pode ver, o nome do dispositivo é totalmente diferente e não há número menor (como isso identifica o dispositivo apenas pelo número maior?).

Parece que alguma terminologia está confusa, mas não consegui resolver isso.

Responder1

Módulos do kernel ("drivers", se você preferir) podem registrar dispositivos de blocos ou caracteres (no sentido unix tradicional, "dispositivo" é uma palavra com muitos significados) no kernel, usando uma rotina como register_blkdevjunto com uma string que supostamente deve identificar o dispositivo. É possível usarqualquerstring para esse propósito, e essas strings aparecem no /proc/devicesarquivo (que é apenas uma representação textual desta tabela do kernel).

Por outro lado, em sistemas Linux modernos, os arquivos /devsão criados udevseguindo uma série de regras complicadas. Esses arquivos supostamente representam maneiras de o espaço do usuário interagir com o kernel, por meio de leituras, gravações e ioctls, o que funciona porque são arquivos "especiais" com um número de dispositivo maior e menor, portanto, os acessos a esses arquivos são traduzidos em chamadas do kernel (a grosso modo).

Esses dois e sua estrutura não têm nenhuma relação. A única conexão é que o número principal do dispositivo desse arquivo especial é consultado sempre que tal arquivo é acessado e usado para localizar o módulo que o registrou. A string sob a qual foi registrado é totalmente irrelevante. O nome sob o qual um arquivo aparece também é totalmente irrelevante, desde que o usuário saiba o nome. Nada impede que você chame seus discos /dev/this-diske, /dev/that-diskem vez disso /dev/sda, e /dev/sdbse sentir vontade de fazê-lo, altere as udevregras.

Masclaroas pessoas gostam de simplificar as coisas, e é por isso que as strings usadas para registrar dispositivos geralmente são iguais ou pelo menos semelhantes aos nomes padrão sob os quais aparecem no /dev. Mas essa é a única conexão.

informação relacionada