Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
pua:acesso_a_dispositivos [2008/09/21 15:32] – maziero | pua:acesso_a_dispositivos [2020/08/18 22:54] (atual) – edição externa 127.0.0.1 | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Acesso a dispositivos ====== | ||
+ | |||
+ | ===== Dispositivos ===== | ||
+ | |||
+ | Um computador não serve para muita coisa se não puder interagir com o mundo que o cerca, recebendo dados externos, armazenando informações e produzindo resultados para seus usuários. Toda essa interação é baseada em dispositivos de entrada/ | ||
+ | |||
+ | ===== Tipos de dispositivos ===== | ||
+ | |||
+ | Apesar da grande diversidade de dispositivos físicos existentes, o UNIX classifica a maioria dos dispositivos com os quais interage em três grandes grupos, cuja estrutura acaba se refletindo na organização do núcleo e nos drivers de dispositivos: | ||
+ | |||
+ | * **Dispositivos de caracteres** (// | ||
+ | |||
+ | * **Dispositivos de blocos** (//block devices//): um dispositivo de bloco permite acesso a informações em blocos de tamanho fixo (usualmente 512 ou 1024 bytes), permitindo o acesso a um ou mais blocos em cada operação. Como o acesso é aleatório, os dados podem fluir em ambas as direções a qualquer instante, Por permitir acesso aleatório e a transferência de dados em blocos, um dispositivo de blocos geralmente é adequado para a construção de um sistema de arquivos. Discos rígidos, disquetes e CDs são exemplos típicos de dispositivos de blocos. As mesmas chamadas de sistema acima citadas são oferecidas para dispositivos de blocos. | ||
+ | |||
+ | * **Interfaces de rede** (//network interfaces// | ||
+ | |||
+ | Além das classes tradicionais acima, uma nova classe de dispositivos vem ganhando espaço nos sistemas de computação, | ||
+ | |||
+ | * **Dispositivos de fluxo** (//stream devices//): um dispositivo de fluxo recebe ou produz dados em uma taxa regular e constante. Esta classe de dispositivos mapeia bem o comportamento de placas de som e de vídeo. O sistema operacional precisa gerenciar buffers para alimentar ou retirar dados desse tipo de dispositivo. | ||
+ | |||
+ | ===== Drivers ===== | ||
+ | |||
+ | Grande parte das chamadas de sistema estão relacionadas a dispositivos físicos. Cada um desses dispositivos exige uma programação específica para ser acessado e controlado. O núcleo do sistema operacional precisa conter código para acessar e controlar todos os dispositivos com os quais possa se relacionar diretamente. O código que efetua o acesso e controle de um dispositivo físico, interagindo diretamente com ele, é chamado de **driver de dispositivo** (//device driver//). | ||
+ | |||
+ | O //driver// de dispositivo tem vários objetivos: | ||
+ | |||
+ | * Interagir com o dispositivo, | ||
+ | * Controlar as funcionalidades e possibilidades de configuração do dispositivo | ||
+ | * Integrar a interface do dispositivo ao restante do núcleo, através de uma interface abstrata. | ||
+ | |||
+ | Na medida do possível, a interface abstrata de dispositivo provida pelo //driver// deve ser homogênea com as interfaces abstratas de outros dispositivos com finalidades similares. Isso permite agrupar os dispositivos em uma mesma " | ||
+ | |||
+ | É importante observar que o driver deve oferecer **mecanismos** de acesso aos dispositivos, | ||
+ | |||
+ | Os //drivers// são parte integrante do núcleo do sistema operacional. Eles podem estar **compilados estaticamente** no núcleo, sendo carregados juntamente com este na inicialização da máquina, ou podem ser carregados posteriormente, | ||
+ | |||
+ | Muitas vezes os //drivers// são complementados por **bibliotecas e ferramentas em modo usuário** (fora do núcleo) para facilitar a configuração do dispositivo e seu uso pelos programadores. Por exemplo, o programa '' | ||
+ | |||
+ | ===== Arquivos de dispositivos e o diretório /dev ===== | ||
+ | |||
+ | No UNIX a maioria das abstrações do núcleo é oferecida aos processos no espaço de usuário sob a forma de arquivos ou de descritores de arquivos (exemplos clássicos dessa filosofia são os //sockets// e //pipes//). Da mesma forma, um dispositivo físico é mapeado para os processos sob a forma de um ou mais arquivos, que podem ser acessados em leitura e/ou escrita. Esses arquivos não correspondem a dados em disco, mas a portas de acesso aos dispositivos, | ||
+ | |||
+ | Assim, as entradas de diretório ''/ | ||
+ | |||
+ | Em um sistema UNIX (e portanto no Linux), os arquivos de dispositivos estão concentrados no diretório ''/ | ||
+ | |||
+ | ^ arquivo ^ dispositivo ^ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | |||
+ | No Linux, a [[http:// | ||
+ | |||
+ | Na listagem de diretório é possível observar o tipo de cada dispositivo: | ||
+ | |||
+ | < | ||
+ | crw------- | ||
+ | crw-rw---- | ||
+ | brw-rw---- | ||
+ | brw-rw---- | ||
+ | </ | ||
+ | |||
+ | Alguns arquivos presentes no diretório ''/ | ||
+ | |||
+ | ^ Nome ^ Dispositivo ^ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | |||
+ | ===== Major & Minor numbers ===== | ||
+ | |||
+ | Os dispositivos são identificados no diretório ''/ | ||
+ | |||
+ | Os //major numbers// são associados ao //driver// responsável pelo dispositivo, | ||
+ | |||
+ | O //minor number// é usado somente pelo //driver//, para discernir qual dos dispositivos que controla está sendo referenciado por um determinado pedido. A listagem a seguir ilustra os //major & minor numbers// dos discos '' | ||
+ | |||
+ | < | ||
+ | brw-rw---- | ||
+ | brw-rw---- | ||
+ | brw-rw---- | ||
+ | brw-rw---- | ||
+ | ... | ||
+ | brw-rw---- | ||
+ | brw-rw---- | ||
+ | brw-rw---- | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Nos núcleos Linux até a versão 2.4, os //major & minor// numbers variam entre 0 e 255. A atribuição de //major numbers// a novos dispositivos e seus respectivos drivers é gerenciada pela LANANA e está indicada em sua relação de dispositivos (uma relação simplificada está presente em ''/ | ||
+ | |||
+ | Geralmente os arquivos presentes em ''/ | ||
+ | |||
+ | < | ||
+ | $ mknod /dev/ttyS0 c 4 64 | ||
+ | </ | ||
+ | |||
+ | irá criar um arquivo para um dispositivo orientado a caracteres chamado ttyS0, com //major number// 4 e //minor number// 64 (esse dispositivo corresponde à porta serial COM1). Após a criação do arquivo, seu usuário, grupo e permissões devem ser ajustados de acordo com a política de acesso ao dispositivo. | ||
+ | |||
+ | Importante: a existência de um arquivo de dispositivo não depende nem implica na existência do dispositivo físico correspondente, | ||
+ | |||
+ | < | ||
+ | $ mknod xxx0 c 244 3 | ||
+ | |||
+ | $ ll xx* | ||
+ | crw-r--r-- | ||
+ | |||
+ | $ cat xxx0 | ||
+ | cat: xxx0: Dispositivo inexistente | ||
+ | </ | ||
+ | |||
+ | Alguns mecanismos foram propostos para eliminar a necessidade de criar manualmente arquivos para representar dispositivos. Uma das iniciativas mais importantes foi o //device filesystem// | ||
+ | |||
+ | Com o advento do núcleo Linux 2.6, o sistema //devfs// foi considerado obsoleto, sendo substituido pelo sistema //udev//. Este último sistema é bastante similar ao //devfs// em seu conceito, mas trabalha inteiramente fora do núcleo, no espaço de usuário, sendo portanto menos intrusivo. | ||
+ | |||
+ | ===== Controle de dispositivos ===== | ||
+ | |||
+ | Além de permitir a entrada e/ou saída de dados sobre os dispositivos, | ||
+ | |||
+ | * mudar o fonte usado em um terminal | ||
+ | * ejetar um CD | ||
+ | * rebobinar uma fita magnética | ||
+ | * colocar uma interface de rede em modo promíscuo | ||
+ | |||
+ | As principais formas de configurar e/ou controlar um dispositivo no mundo UNIX são: | ||
+ | |||
+ | * através de comandos identificados por seqüências de caracteres ou bytes reservados no fluxo de dados escrito no dispositivo. O //driver// reconhece essas seqüências e aplica os controles correspondentes sobre os dispositivos. Essa técnica é utilizada sobretudo no controle de terminais, onde as conhecidas " | ||
+ | * através da chamada de sistema '' | ||
+ | |||
+ | A chamada '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int ioctl (int filedes, int command, ...) | ||
+ | </ | ||
+ | |||
+ | Essa chamada aplica o comando '' | ||
+ | |||
+ | Os comandos são também chamados //IOCTLs// e são definidos por constantes inteiras. A grande maioria dos //IOCTLs// é específica para cada dispositivo e sua definição também depende do sistema operacional e variante considerados. A melhor fonte de informação a respeito dos comandos disponíveis sobre um determinado dispositivo são as páginas de manual ou documentação do dispositivo e seu respectivo //driver//. Um exemplo é a página de manual dos dispositivos ''/ | ||
+ | |||
+ | <code c> | ||
+ | ... | ||
+ | cd = open ("/ | ||
+ | ioctl (cd, CDROMEJECT, 0) ; | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | ===== O sistema /proc ===== | ||
+ | |||
+ | Além dos dispositivos externos, outro foco de atenção do programador de sistema é o núcleo do sistema operacional. O diretório virtual ''/ | ||
+ | |||
+ | Como os arquivos desse diretório são virtuais (não estão mapeados em disco), seu tamanho normalmente é indicado como zero (0). Apesar disso, é possível consultá-los usando os utilitários padrão '' | ||
+ | |||
+ | < | ||
+ | espec:/> cat / | ||
+ | 0000-001f : dma1 | ||
+ | 0020-003f : pic1 | ||
+ | 0040-005f : timer | ||
+ | 0060-006f : keyboard | ||
+ | 0070-007f : rtc | ||
+ | 0080-008f : dma page reg | ||
+ | 00a0-00bf : pic2 | ||
+ | 00c0-00df : dma2 | ||
+ | 00f0-00ff : fpu | ||
+ | 01f0-01f7 : ide0 | ||
+ | 03c0-03df : vga+ | ||
+ | 03f6-03f6 : ide0 | ||
+ | 03f8-03ff : serial(auto) | ||
+ | 08b0-08bf : ServerWorks CSB5 IDE Controller | ||
+ | | ||
+ | | ||
+ | 08c0-08c3 : ServerWorks CSB5 IDE Controller | ||
+ | 0cf8-0cff : PCI conf1 | ||
+ | cce0-ccff : Intel Corp. 82544EI Gigabit Ethernet Controller (Copper) | ||
+ | | ||
+ | d800-d8ff : Adaptec AIC-7899P U160/m (#2) | ||
+ | dc00-dcff : Adaptec AIC-7899P U160/m | ||
+ | e800-e8ff : ATI Technologies Inc Rage XL | ||
+ | ecc0-ecff : Intel Corp. 82557/8/9 [Ethernet Pro 100] | ||
+ | | ||
+ | </ | ||
+ | |||
+ | A grande maioria dos arquivos em ''/ | ||
+ | |||
+ | < | ||
+ | $ echo www.teste.com > / | ||
+ | </ | ||
+ | |||
+ | esse comando permite alterar dinamicamente o // | ||
+ | |||
+ | < | ||
+ | $ echo 1 > / | ||
+ | </ | ||
+ | |||
+ | esse comando ativa a funcionalidade de encaminhamento de pacotes (//packet forwarding// | ||
+ | |||
+ | ^arquivo ^ conteúdo ^ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | |||
+ | A maior parte do diretório ''/ | ||
+ | |||
+ | ^ arquivo ^ conteúdo ^ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | | ''/ | ||
+ | |||
+ | ===== Atividades ===== | ||
+ | |||
+ | * Com base nas informações disponíveis no sistema ''/ | ||
+ | * Qual seria a invocação de chamada necessária para rebobinar a fita magnética | ||