Você está na página 1de 7

Devices - Kernel Linux

Devices - Kernel Linux Arquivos e Tipos de Arquivos Em sistemas like-unix os arquivos podem representar

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.

-- arquivo com código binário ELF 32-bit LSB executável -- arquivo de texto ASCII -- arquivo de imagem PNG

/bin/ls

/etc/lilo.conf

/home/rei/foto.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 ->

/bin/lspci -> /usr/bin/lspci

/sbin/reboot -> halt

/init.d/ssh

-- arquivo de link simbólico -- arquivo de link simbólico -- 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:

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

VIA82XX

87456 0 snd-via82xx

-- Driver base e dependência do

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

informação contida nos arquivos de dispositivos. Licença Copyright (c) 2005 Reinaldo Carvalho. <reinaldoc

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

section entitled "GNU Free Documentation License". Autor: Reinaldo Carvalho - reinaldoc (at) gmail (dot) com