Introdução aos Sistemas Operacionais Subsistema de Entrada e Saída Eleri Cardozo FEEC/Unicamp Entrada e Saída O subsistema de entrada e saída é responsável pela interface entre o sistema operacional e os periféricos conectados ao computador (disco, vídeo, teclado, mouse, microfone, altofalante, câmera, rede, etc. etc.). Este subsistema é responsável por tornar mais simples ao sistema operacional e aos processos a interação com os periféricos (por exemplo, escondendo as interrupções geradas pelos periféricos). Vamos examinar 3 componentes fundamentais deste subsistema: Módulos; Acionadores de dispositivos (device drivers); Acesso direto à memória (DMA).
Entrada e Saída Chamadas de Sistema (E/S) Provê uma interface homogênea para operações de E/S Subsistema de Entrada e Saída Núcleo dados interrupções Periférico Módulos Módulos provêem extensões ao núcleo do sistema operacional. Estas extensõs (os módulos) podem ser anexadas ao núcleo sob demanda, por exemplo, quando um periférico é conectado. Módulos são componentes fundamentais para o subsistema de entrada e saída pois permitem incorporar ao núcleo as funcionalidades necessárias para a operação dos periféricos conectados ao computador (e apenas destes). O núcleo oferece uma interface para o desenvolvimento de módulos. Portanto, qualquer programador que conheça esta interface pode desenvolver um módulo para operar um periférico.
Módulos Módulos são usados tipicamente na implementação de: Acionadores de dispositivos. Exemplo: e100e (Ethernet), nvidia (vídeo), psmouse (mouse), soundcore (som). Sistema de arquivos (filesystem drivers). Exemplo: fat, vfat, nfs. Pilhas de protocolos de rede (network drivers). Exemplo: ipx, isdn. Inclusão de novas chamadas de sistema. Exemplo: Video for Linux (v4l). Linux provê uma interface (conjunto de chamadas de sistema) para a programação de módulos e um conjunto de comandos para o gerenciamento de módulos. Módulos no Linux
Módulos no Linux O Linux emprega um conjunto de arquivos de configuração para o gerenciamento de módulos que especificam: Os módulos que devem ser instalados na inicialização do sistema (/etc/modules). Os módulos que não devem ser carregados no sistema (blacklist) (/etc/modprobe.d/blacklist.conf). Os parâmetros de inicialização dos módulos e suas dependências de outros módulos, quando necessários (/etc/modprobe.d/<nome do módulo>.conf). Módulos no Linux /* hello.c * "Hello world" - um modulo elementar * Compile com gcc -c hello.c -Wall */ /* Declara o codigo como modulo (parte do nucleo) */ #define KERNEL /* uma parte do nucleo */ #define MODULE /* mas nao uma parte permanente */ /* inclusoes padrao para modulos */ #include <linux/modversions.h> #include <linux/module.h> /* Inicializacao do LKM (loadable kernel module) */ int init_module() { printk("o modulo hello world foi instalado\n"); return 0; } /* Cleanup */ void cleanup_module() { printk("o modulo hello world foi desinstalado\n"); }
Desenvolvimento de Módulos O desenvolvedor de módulos deve utilizar apenas as bibliotecas empregadas na programação do núcleo. Por exemplo, libc não pode ser empregada em módulos (razão pela qual o exemplo anterior não utilizou a função printf). Durante o teste do módulo uma falha pode comprometer todo o núcleo (lembre-se que módulos são parte do núcleo). O desenvolvedor pode utilizar User-mode Linux (UML) para desenvolver e testar módulos. UML é uma máquina virtual que executa o sistema Linux no espaço do usuário. Acionadores de Dispositivos 0 1 N-1 Blocos e Inodes (visão abstrata do dispositivo) Acionador de Dispositivo (Device Driver) Dispositivo físico de armazenamento
Acionadores de Dispositivos Núcleo Acionador de Dispositivo dados int. controle Barramento (PCI, ISA, etc.) Buffer Registradores Controlador de Dispositivo Interface de comunicação (SATA, USB, etc.) Dispositivo Dispositivos de E/S Os acionadores de dispositivos operam de duas formas em função do dispositivo físico que controlam Orientados a bloco: a transferência de dados se dá em blocos de bytes. Acionadores de disco, CD-ROM, memória USB são exemplos deste tipo. Orientados a caractere: a transferência de dados se dá byte a byte. Acionadores de terminais, porta serial e porta paralela são exemplos deste tipo. Via de regra, os acionadores de dispositivos orientados a bloco utilizam um cache de blocos ou páginas em memória (cache de buffers ou páginas no Unix/Linux). Portanto, são mais complexos que os orientados a caractere.
Acionadores de Dispositivos no Linux No Linux, acionadores de dispositivos são acessados a partir do espaço do usuário da mesma forma que arquivos. Para tal, cada acionador de dispositivo é representado por um arquivo especial no diretório /dev. Para relacionar um arquivo no diretório /dev com um acionador de dispositivo são empregados dois identificadores: número maior e número menor. O comando mknod cria um arquivo especial que será associado a um acionador de dispsitivo, por exemplo mknod /dev/mydriver c 60 0 cria um acionador de de dispositivo de nome mydriver do tipo caractere (c) cujos números maior e menor são 60 e 0, respectivamente. Acionadores de Dispositivos no Linux
Acionadores de Dispositivos no Linux open close read write mmap ioctl Chamadas de Sistema (E/S) Implementadas pelo acionador de dispositivo Acionador de Dispositivo Dispositivo de E/S Exemplo: Video for Linux (v4l) Inicia/encerra operação do dispositivo Mapeia buffer de imagem do acionador de dispositivo na memória do processo open close mmap ioctl Chamadas de Sistema (E/S) Configura dispositivo (formato e tamanho da imagem) Controla o dispositivo (captura de imagem) /dev/video0 Acionador de Dispositivo (videodev) WebCam Acionador de Dispositivo (uvcvideo) USB
Acesso Direto à Memória Acesso direto à memória (DMA: Direct Memory Access) é um componente fundamental do subsistema de entrada e saída e presente em praticamente todos os dispositivos de entrada e saída orientados a bloco como discos, CD-ROM, etc. Estes dispositivos possuem um componente de hardware denominado controlador de DMA. Este controlador tem por objetivo liberar a CPU de copiar dados de/para a memória em operações de entrada e saída. DMA é usado tipicamente em: Transferência de páginas entre memória e área de swap. Transferência de blocos entre memória (cache de bufffers ou de páginas) e disco. Transferência de pacotes de rede entre memória e NIC. Acesso Direto à Memória CPU Memória CPU Memória CPU Memória Controlador de DMA Controlador de DMA Controlador de DMA (a) Programação do controlador de DMA (b) Transferência de dados para a memória (c) Notificação via interrupção barramento
Acesso Direto à Memória Memória Barramento CPU-Memória CPU Chamadas de Sistema (E/S) Acionador de Dispositivo dados int. controle Barramento Controlador de DMA Controlador de Dispositivo Interface de comunicação (SATA, USB, etc.) Dispositivo