Você está na página 1de 7

Devices - Kernel Linux

Arquivos e Tipos de Arquivos


Em sistemas like-unix os arquivos podem representar uma informação: como os arquivos que
contém textos, imagens, ou código binário de uma aplicação.
/bin/ls -- arquivo com código binário ELF 32-bit LSB executável
/etc/lilo.conf -- arquivo de texto ASCII
/home/rei/foto.png -- arquivo de imagem PNG

Os arquivos também podem representar um diretório, neste caso, o próprio diretório é um arquivo,
contudo não possui informação, contém apenas referências a outros arquivos, que podem ser
arquivos de informação, ou também diretórios, assim como qualquer outro tipo de arquivo.
/etc -- arquivo do tipo 'diretório'
/proc -- arquivo do tipo 'diretório'
/var -- arquivo do tipo 'diretório'

Existem os arquivos que represetam um link para outro arquivo, de qualquer tipo.
/etc/rc2.d/S20ssh -> ../init.d/ssh -- arquivo de link simbólico
/bin/lspci -> /usr/bin/lspci -- arquivo de link simbólico
/sbin/reboot -> halt -- arquivo de link simbólico

No exemplo acima, os elementos a esquerda são os arquivos do tipo "link", que, neste caso, estão
fazendo referência a arquivos de informação, à direita.
Existem outros tipos de arquivos: sockets, que são utilizados para comunição entre processos, do
tipo "cliente-servidor", normalmente identificados atráves de um porta (tcp/udp). Assim como,
arquivos do tipo named pipes, sendo utilizados para comunicação entre processos em uma mesma
máquina.
O kernel trabalha como uma camada de comunicação entre o hardware e os aplicativos, e esta
comunicação, em relação aos dispositivos, é realizada através dos arquivos de dispositivo de bloco
e dos arquivos de dispositivo de caractere. Explicar a ligação destes arquivos de dispositivos
com o Kernel é a meta deste artigo. Da mesma forma que o kernel provê as "chamadas de sistema"
como interfaces de programação, os arquivos de dispositivos são interfaces para acesso a
dispositivos.
A diferença entre os arquivos de dispositivos é a forma do acesso aos dados. Enquanto os
arquivos de dispositivo de bloco manipulam dados em blocos de 512 bytes (ou múltiplo deste
valor), os arquivos de dispositivo de caractere, manipulam fluxo de dados de 1 byte (1 byte => 8
bits => 2 hexadecimais => 1 caractere ascii).
• Dispositivos de bloco:
/dev/hda
/dev/hdb1
/dev/fd0
/dev/md0

• Dispositivos de caractere:
/dev/ttyS0
/dev/psaux
/dev/dsp
/dev/lp0
Arquivos de Dispositivos e Device Numbers
Cada interface de hardware, ou implementação de device driver, recebe do kernel um identificador
chamado device number, essa associação pode ser feita tanto em tempo de boot, como a uma placa
de som, assim como, posteriormente, quando inserimos um pen-drive.
Cada driver inserido ou carregado no kernel, é associado automaticamente a um device number,
quando este driver obtem controle a algum hardware, será utilizado como meio de acesso a este
hardware. Assim como, todo arquivo de dispositivo faz referência a um device number.
Driver (build-in ou módulo) => Device Number <= Arquivos de Dispositivo

Caso seja carregado um driver que não obtenha controle de um hardware, este não será associado a
um device number. Sendo apresentado o erro: "No such device", se um acesso for feito a este
arquivo de dispositivo.
Assim, as aplicações que realizam acesso ao hardware, indicam qual hardware (hd, placa de som,
etc) desejam acesso, através do respectivo device number. Sendo assim, sistemas like-unix,
abstraem da aplicação a necessidade de conhecer o device number do hardware, visto que os
valores dos device numbers são difentes em cada kernel (Linux, OpenBSD, FreeBSD, NetBSD,
Solaris, HP-UX, etc); assim, as aplicações fazem referência a um "arquivo de dispositivo", e este
arquivo de dispositivo contém a referência a um device number.
A única função dos arquivos de dispositivos é fazer referência a um device number; por exemplo, o
device number da placa de som no kernel linux é 14,3. Assim, o arquivo de dispositivo /dev/dsp faz
referência ao device number 14,3. (Depois veremos como criar um arquivo de dispositivo)
Gostaria de ressaltar que os nomes dos arquivos de dispositivos tem apenas carater informativo,
pois podemos criar um arquivo de dispositivo chamado /dev/placa-de-som fazendo referência ao
device number 14,3. Assim, poderiamos configurar nosso aplicativo multimidia para utilizar o
dispositivo /dev/placa-de-som como saída de audio, visto que o driver da placa de som esta
associada ao device number 14,3 e não a um arquivo de dispositivo.
O device number é formado pois dois componentes: major number, que especifica a seção ao qual o
dispositivo pertence, e o minor number, subclassifica o dispositivo. Os device numbers são uma
especificação de cada kernel.
• Kernel Linux:
http://www.kernel.org/pub/linux/docs/lanana/device-list/devices-2.6+.txt

TODO: Não encontrei referências para documentos contendo os device numbers de outros kerneis,
favor me enviar a URL
Descrição dos principais arquivos de dispositivos:
Device Descrição Tipo Major
number Minor number
/dev/hda disco master da IDE0 block 3
0
/dev/hda1 1ª partição do disco master da IDE0 block 3
1
/dev/hda2 2ª partição do disco master da IDE0 block 3
2
/dev/hda3 3ª partição do disco master da IDE0 block 3
3
/dev/hda4 4ª partição do disco master da IDE0 block 3
4
/dev/hdb disco slave da IDE0 block 3
64
/dev/hdb1 1ª partição do disco slave da IDE0 block 3
65
/dev/hdb2 2ª partição do disco slave da IDE0 block 3
66
/dev/hdb3 3ª partição do disco slave da IDE0 block 3
67
/dev/hdb4 4ª partição do disco slave da IDE0 block 3
68
/dev/hdc disco master da IDE1 block 22
0
/dev/hdc1 1ª partição do disco master da IDE1 block 22
1
/dev/hdc2 2ª partição do disco master da IDE1 block 22
2
/dev/hdc3 3ª partição do disco master da IDE1 block 22
3
/dev/hdc4 4ª partição do disco master da IDE1 block 22
4
/dev/hdd disco slave da IDE1 block 22
64
/dev/hdd1 1ª partição do disco slave da IDE1 block 22
65
/dev/hdd2 2ª partição do disco slave da IDE1 block 22
66
/dev/hdd3 3ª partição do disco slave da IDE1 block 22
67
/dev/hdd4 4ª partição do disco slave da IDE1 block 22
68
/dev/fd0 dispositivo de disquete block 2
0
/dev/ttyS0 1ª porta serial - COM1 char 4
64
/dev/ttyS1 2ª porta serial - COM2 char 4
65
/dev/dsp 1ª placa de som char 14
3
/dev/sda 1º disco SCSI block 8
0
/dev/sda1 1ª partição do 1º disco SCSI block 8
1
/dev/sdb 2º disco SCSI block 8
16
/dev/sdb1 1ª partição do 2º disco SCSI block 8
17
/dev/psaux mouse ps2 char 10
1
/dev/usb/lp0 1ª impressora USB char 180
0
/dev/usb/lp1 2ª impressora USB char 180
1
/dev/usb/mouse0 1º mouse USB char 180
16
/dev/usb/mouse1 2º mouse USB char 180
17
/dev/input/js0 1º joystick char 13
0
/dev/input/js1 2º joystick char 13
1
/dev/video0 1º placa de tv ou webcam char 81
0
/dev/video1 2º placa de tv ou webcam char 81
1
/dev/radio0 1º receptor de radio char 81
64
/dev/radio1 2º receptor de radio char 81
65
Os devices numbers podem ser visualisados através do comando "ls -l", conforme exemplo abaixo:
ls -l /dev/hd[a-d]
brw-rw---- 1 root disk 3, 0 2006-08-19 03:38 /dev/hda
brw-rw---- 1 root disk 3, 64 2006-08-19 03:38 /dev/hdb
brw-rw---- 1 root cdrom 22, 0 2006-08-19 03:38 /dev/hdc
brw-rw---- 1 root cdrom 22, 64 2006-08-19 03:38 /dev/hdd

Os aplicativos acessam os arquivos de dispositivos, obedecendo as permissões aplicadas em cada


dispositivo, coforme exemplo:
crw-rw---- 1 root audio /dev/dsp

Assim, somente o usuário root, e os usuários pertencetem ao grupo audio terá acesso ao dispositivo
/dev/dsp, assim como somente eles poderão utilizar a placa de som através deste arquivo de
dispositivo.
Concluimos então, que kernel recebe das aplicações solicitações de leitura/escrita a um arquivo de
dispositivo, realizando-as no respectivo hardware identificado pelo device number, assim como,
utilizará o respectivo driver (build-in ou módulo) que esta associado a este device number.

Major number e Minor number


Vejamos agora, alguns exemplos de classificação dos identificadores de dispositivos major
number e minor number. Abaixo podemos observar a descrição dos grupos que são indicados
pelo "major number". A série de dispositivos que possui "major number" igual a '3', são dispositivos
do tipo "First IDE hard disk/CD-ROM interface", ou seja, dispositivos conectados a primeira IDE.
Assim como, os dispositivos que possuem "major number" igual a '14', são dispositivos do tipo
"Open Sound System (OSS)", ou seja, dispositivos ligados ao sistema de som.
major number: 3 - First MFM, RLL and IDE hard disk/CD-ROM interface
minor number: 0 = /dev/hda Master: whole disk (or CD-ROM) (3,0)
1 = /dev/hda1 First partition (3,1)
2 = /dev/hda2 Second partition (3,2)
...
63 = /dev/hda63 63rd partition (3,3)

major number: 4 - TTY devices


minor number: 0 = /dev/tty0 Current virtual console (4,0)
1 = /dev/tty1 First virtual console (4,1)
...
63 = /dev/tty63 63rd virtual console (4,43)
64 = /dev/ttyS0 First UART serial port (4,64)
...
255 = /dev/ttyS191 192nd UART serial port
(4,255)

major number: 14 - Open Sound System (OSS)


minor number: 0 = /dev/mixer Mixer control (14,0)
1 = /dev/sequencer Audio sequencer (14,1)
2 = /dev/midi00 First MIDI port (14,2)
3 = /dev/dsp Digital audio (14,3)
4 = /dev/audio Sun-compatible digital audio (14,4)
6 = /dev/sndstat Sound card status information (14,6)
7 = /dev/audioctl SPARC audio control device (14,7)
8 = /dev/sequencer2 Sequencer -- alternate device (14,8)
16 = /dev/mixer1 Second soundcard mixer control
(14,16)

Os identificadores de "major number" e "minor number" são utilizados para criar os arquivos de
dispositivo, por exemplo:
mknod /dev/hda b 3 0

Assim como, podemos criar um dispositivo com outro nome, mas que aponte para os mesmos
identificadores de "major number" e "minor number". Por exemplo:
mknod /dev/disco b 3 0

Neste caso, criamos o arquivo /dev/disco apontando para os mesmos device numbers que o arquivo
/dev/hda aponta, fazendo-os equivalentes. A lista de identificadores (device numbers) especifica
como acessar determinado dispositivo; com estes valores, podemos criar os arquivos de dispositivo.
Assim como, o dispositivo conectado como master na IDE0 será identificado internamento no
kernel como: major number 3 e minor number 0; sendo assim, basta criar um arquivo de dispositivo
de bloco apontando para este identificador, que obteremos acesso ao hardware.
Os nomes dos arquivos de dispositivos são apenas uma convenção. O importante é que o
dispositivo aponte para o identificador correto.

Drivers de Dispositivos - Device Drivers


O kernel Linux é monolítico e pode utilizar Build-in Drivers ou Module Drivers; durante a
inicialização de um driver, este driver tenta obter controle (reconhecer) de um hardware, se isto
ocorrer, este driver é associado a um device number, sendo utilizado como meio de acesso a este
hardware.
Aplicação => Arquivo de dispositivo => Device numbers => Driver => Hardware
xmms: /dev/dsp 14,3 emu10k1 Creative Live
5.1
xorg: /dev/nvidia0 195,0 nvidia Gforce FX
5500
xorg: /dev/psaux 10,1 psmouse Clone PS/2
optical muose
mount: /dev/hda3 3,3 ide-disk Maxtor
6Y080L0 80Gb
tvtime: /dev/video0 81,0 bttv PlayTV MPEG2
Brooktree Corporation Bt878

• Build-in Drivers
Estes drivers estão inseridos juntamente ao core do kernel no momento da compilação:
-rw-r--r-- 1 root root 2.2M 2006-06-05 14:49 /boot/vmlinuz-2.6.16
-rw-r--r-- 1 root root 2.2M 2006-08-11 03:27 /boot/vmlinuz-2.6.17

O core do kernel é composto por vários componentes, como: controle de processos, gerência de
memória, entre outros. Após a inicialização destes componentes básicos, ocorre a inicialização dos
drivers build-in, assim como, a assossiação desdes drivers ao respectivo device number.
• Modules Drivers
Estes drivers são armazenados no sistema de arquivos, no diretório /lib/modules/[kernel-version]:
drwxr-xr-x 3 root root 4096 2006-06-05 14:59 /lib/modules/2.6.16
drwxr-xr-x 3 root root 4096 2006-08-11 03:34 /lib/modules/2.6.17

Os drivers compilados como módulo podem ser carregados de duas maneiras em linha de comando.
Utilizando como exemplo o driver para placas de som "VIA 82C686A/B, 8233/8235 AC97
Controller":
insmod /lib/modules/[kernel-version]/kernel/sound/pci/snd-via82xx.ko

Entretanto é aconselhado o uso da ferramenta modprobe, pois o insmod não carrega


automaticamente módulos que são dependências (explicado abaixo) do módulo que esta sendo
carregado (snd-via82xx.ko).
modprobe snd-via82xx

Ao utilizar o insmod, é necessário verificar a versão do kernel em uso, [kernel-version], para


localizar os módulos corretos para o kernel em uso:
uname -r

• Dependências de drivers
Alguns drivers utilizam outros drivers em seu funcionamento, sendo necessário que o(s) driver(s)
dependente(s), já esteja(m) carregado(s), ou este(s), deve(m) estar sendo carregado(s) no mesmo
momento. Caso seja tentado carregar um driver que necessite de outro driver, sem o prévio
carregamento do driver dependente, ocorrerá o erro chamado: Unresolved Symbols. Este erro
também pode ocorrer ao tentar-se carregar um módulo pertencente a outro kernel. É importante
salientar, que os modúlos são parte exclusiva da compilação atual, ou seja, mesmo que se use a
mesma versão do kernel, mas em uma outra compilação, principalmente se compilado em outra
seleção de drivers (vide make menuconfig), é possivel que ocorra este erro.
Unresolved Symbols ocorre ao carregar um módulo, quando este módulo necessita de um recurso
do kernel que não esta presente; este recurso é provido por outro componente build-in não
compilado, ou outro módulo não carregado.
A depedência de drivers ocorre com intuito de evitar re-escrita de código, quando muitos drivers
precisam reutilizar um mesmo trecho de código, este trecho é criado como um driver "base", e
outros drivers podem utilizar este driver "base". Segue um exemplo:
bttv 154464 0 -- Driver da placa de TV Pixelview
PlayTV MPEG2
video_buf 16896 1 bttv -- Driver base e dependência do
bttv
btcx_risc 4228 1 bttv -- ""
tveeprom 13580 1 bttv -- ""

snd-via82xx 17440 0 -- Driver da placa de som com


Chipset VIA82XX
snd-pcm 87456 0 snd-via82xx -- Driver base e dependência do
VIA82XX
snd-ac97-codec 59116 0 snd-via82xx -- ""
gameport 3380 0 snd-via82xx -- ""
snd-mpu401-uart 5520 0 snd-via82xx -- ""
snd 47812 0 snd-via82xx snd-pcm snd-ac97-codec snd-mpu401-
uart
snd-page-alloc 9908 0 snd-via82xx snd-pcm ""

Utilizando a ferramenta modprobe, todos drivers necessários para que o driver principal funcione,
serão inicializados:
modprobe -v bttv
insmod /lib/modules/2.6.15/kernel/drivers/media/video/tveeprom.ko
insmod /lib/modules/2.6.15/kernel/drivers/media/video/btcx-risc.ko
insmod /lib/modules/2.6.15/kernel/drivers/media/video/video-buf.ko
insmod /lib/modules/2.6.15/kernel/drivers/media/video/bttv.ko card=72 tuner=43
radio=1

Neste momento, o driver bttv foi associado ao device number 81,0 conforme especificação do
kernel linux.
• Initrd
Initrd é um arquivo do tipo "Linux filesystem data", que é formado pela estrutura de diretórios de
um sistema de arquivos raiz, e contém drivers que devem ser carregados antes do kernel acessar os
sistemas de arquivos dos discos. Na maioria das vezes, os módulos contidos na initrd são drivers
necessários para que o kernel consiga acessar o sistema de arquivos raiz do disco rídigo, como os
drivers: ext2, ext3, reiserfs, xfs, jfs. O uso do initrd não é necessário caso estes drivers sejam
compiládos build-in no kernel.
O acesso ao initrd ocorre através do "Boot loader", no caso do LILO, este é um acesso direto¹ ao
disco, da mesma forma que o kernel é acessado e executado.
¹ A MBR é formada pelos 512º bytes iniciais do disco; sendo que o "Boot Loader" fica residente
entre o byte 1º até o byte 446º. Em relação ao LILO, neste espaço da MBR também é gravado a
localização física (head, sector, cylinder) do kernel e initrd que estão disponiveis para boot do
sistema. O acesso ao kernel e ao initrd que é realizado pelo código do LILO residente na MBR
através da sua localização física, é chamado "acesso direto". Este acesso não depende do tipo de
sistema de arquivos da partição; simplesmente os dados do kernel são carregados para a memória e
executado-os. Mais informações sobre sistema de boot, veja neste artigo.
• Observações
Somente após o carregamento do respectivo driver, é possível acessar os dispositivos de
hardware¹ através dos devices numbers. Sendo assim, o hardware fica inacessível aos aplicativos,
até que o driver necessário esteja carregado no kernel, seja build-in ou como módulo; ou seja,
somente com o driver carregado é possível a comunicação com o hardware² através dos arquivos
de dispositivos.
¹ Dispositivos de hardware são as placas físicas: placa de rede, placa de som, placa de vídeo, etc.
² A comunicação com o hardware é feita através dos devices numbers que é a única informação
contida nos arquivos de dispositivos.

Licença
Copyright (c) 2005 Reinaldo Carvalho. <reinaldoc gmail.com>.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled "GNU
Free Documentation License".

Autor: Reinaldo Carvalho - reinaldoc (at) gmail (dot) com

Você também pode gostar