EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
Introdução aos Sistemas Operacionais Subsistema de Entrada e Saída
Eleri Cardozo FEEC/Unicamp
EA876 - Prof. 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).
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
Entrada e Saída Provê uma interface homogênea para operações de E/S
Chamadas de Sistema (E/S)
Subsistema de Entrada e Saída
dados
Núcleo
interrupções
Periférico
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
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.
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
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.
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
Módulos no Linux
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
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/.conf). ●
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
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 #include /* 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"); }
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
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.
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
Acionadores de Dispositivos 0
1
N-1
Acionador de Dispositivo (Device Driver)
Dispositivo físico de armazenamento
Blocos e Inodes (visão abstrata do dispositivo)
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
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
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
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.
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
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.
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
Acionadores de Dispositivos no Linux
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
Acionadores de Dispositivos no Linux open
close
read
write
mmap
ioctl
Implementadas pelo acionador de dispositivo
Chamadas de Sistema (E/S)
Acionador de Dispositivo
Dispositivo de E/S
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
Exemplo: Video for Linux (v4l) Mapeia buffer de imagem do acionador de dispositivo na memória do processo
Inicia/encerra operação do dispositivo open
close
mmap
Configura dispositivo (formato e tamanho da imagem) ioctl
Controla o dispositivo (captura de imagem)
Chamadas de Sistema (E/S)
/dev/video0
Acionador de Dispositivo (videodev)
Acionador de Dispositivo (uvcvideo)
WebCam
USB
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
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.
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
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
EA876 - Prof. Eleri Cardozo - FEEC/Unicamp
Acesso Direto à Memória Chamadas de Sistema (E/S)
Barramento CPU-Memória
Memória
Acionador de Dispositivo
CPU dados
controle
int.
Barramento
Controlador de DMA
Controlador de Dispositivo Interface de comunicação (SATA, USB, etc.)
Dispositivo