SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br - Módulo 4 ENTRADAS E SAIDAS Uma das principais funções dos sistemas operacionais é controlar os dispositivos de entrada e saída (E/S ou I/O). O Sistema Operacional deve ser capaz de enviar comandos para os dispositivos, capturar interrupções e tratar erros. Deve ainda oferecer uma interface entre os dispositivos e o restante do sistema. Normalmente os códigos que controlam esses dispositivos representam uma parte significativa do Sistema Operacional. Figura 1 - Esquema de E/S 1. PRINCÍPIOS DE HARDWARE DE E/S O Hardware é sempre visto de maneiras diferentes: os engenheiros elétricos vêem em termos de fios, chips, etc; enquanto os programadores vêem a interface apresentada em forma de software. No entanto, nossa preocupação é em entender como o hardware é programado e suas interações. 1.1. Dispositivos de E/S Tais dispositivos podem ser divididos em duas categorias: a. Dispositivos de Bloco; e b. Dispositivos de Caractere. 1 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br O primeiro armazena informações em blocos de tamanho fixo, cada um com seu próprio endereço, que podem variar de 512 a 32768 bytes. A propriedade essencial deste tipo de dispositivos é que é possível ler ou gravar independente de todos os outros, como por exemplos os discos. O disco é um dispositivo de blocos porque independente de onde o braço esteja sempre é possível buscar outro cilindro e esperar o bloco solicitado passar sob o cabeçote. O dispositivo de caractere entrega ou aceita um fluxo de caracteres sem considerar qualquer estrutura de bloco. Não é endereçável, tampouco possui estrutura de busca como no disco. Exemplos deste tipo de dispositivo são as impressoras, placas de rede, mouses, dentre outros. Este modelo proposto é utilizado como uma base para construir, de forma independente de dispositivo algumas partes do Sistema Operacional que tratam de E/S. O sistema de arquivos, por exemplo, lida apenas com dispositivos de blocos abstratos e deixa a parte dependente do dispositivo para o software de baixo nível chamado drives do dispositivo. A comunicação de um dispositivo com o sistema computacional é feita através do envio de sinais (cabo ou ar) num ponto de conexão chamado de porta. O meio usado por um ou mais dispositivos para conexão com o computador é chamado de barramento. Para cada barramento, é definido um protocolo que especifica um conjunto de mensagens que podem ser enviadas pelos fios. 1.2. Controladoras de Dispositivos Os dispositivos de E/S geralmente constituem em um componente mecânico e outro eletrônico. Assim, é possível separar as duas partes para oferecer um projeto modular e genérico. O componente eletrônico é chamado Controladora ou Adaptador de Dispositivo. Nos PC’s normalmente tomam a forma de uma placa de circuito impresso que pode ser inserida em um slot na placa mãe do computador. O componente mecânico é o dispositivo em si. Uma placa controladora pode manipular até oito dispositivos idênticos. É comum encontrar unidades de disco que se ajustam aos padrões de interfaces controladoras de disco IDE ou SCSI. É importante saber este conceito, visto que o Sistema Operacional normalmente trabalha com a controladora e não com o dispositivo; geralmente faz E/S escrevendo comandos nos registradores das controladoras. São tarefas do Controlador: - converter um “stream” serial de bits em blocos de bytes - realizar correção de erros se necessário - tornar dados disponíveis para memória principal - Sistema Operacional inicia o controlador com parâmetros 1.3. Barramento A maioria dos pequenos computadores trabalha com barramento único para comunicação entre CPU e controladoras. Grandes computadores, como os mainframes, utilizam um modelo 2 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br diferente com múltiplos barramentos e computadores especializados de E/S chamados de Canais de E/S que assumem parte da carga da CPU principal. Figura 2 - Barramento A interface entre a controladora e o dispositivo normalmente é de muito baixo nível. Independente da organização dos dados no disco o que realmente sai da unidade é um fluxo serial de bits, iniciado com um preâmbulo, depois os 4096 bits em um setor e por fim uma soma de verificação conhecida por ECC (Error-Correcting-Code – Código de Correção de Erros). O preâmbulo é gravado quando o disco é formatado e contém o cilindro e o número do setor e dados semelhantes, bem como as informações de sincronização. O trabalho da controladora é converter o fluxo serial de bits em um bloco de bytes e executar a correção de erros necessária, tudo isso em um buffer e então copiado para a memória principal do computador. Outro exemplo do trabalho de uma controladora é o monitor CRT. Ela lê a memória que contém os caracteres a serem exibidos e gera sinais para instruir os feixes do CRT a fim de fazê-lo escrever na tela. Se não fosse assim o programador do Sistema Operacional teria que programar explicitamente uma varredura análoga para o tubo. 1.4. E/S Mapeada em Memória Cada controladora possui um conjunto de registradores que são utilizados para possibilitar a comunicação com a CPU. Em alguns computadores esses registradores fazem parte do endereçamento da memória e são chamados de E/S mapeada em memória. 3 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br Figura 3 - a) Espaço de E/S e memória separados. b) E/S Mapeada na memória. c) Híbrido. A E/S mapeada em memória não precisa de instruções especiais (código específico) para ler/escrever nos registradores, nem há necessidade de mecanismo especial de proteção. Os Registradores de controle são variáveis na memória, ou seja, Driver que pode ser escrito totalmente em C. As instruções de referencia a memória referenciam registradores. Loop: TEST PORT_4 BEQ READY BRANCH LOOP READY: Este modelo também apresenta certas desvantagens como um espaço de endereçamento para todos, módulos de memória e dispositivos que devem examinar referencias. Os barramentos de memória de alta velocidade e dispositivos de E/S não conseguem examinar. Figura 4 - (a) Arquitetura único barramento. (b) Arquitetura barramento duplo. 1.5. Interrupções A E/S mapeada em memória é muito utilizado para representar as IRQ (Interrupt ReQuest), que é uma entrada física para o chip controlador de instruções. Essas IRQ’s podem ser controladas por jumper’s ou software. O chip controlador mapeia cada entrada de IRQ 4 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br (normalmente limitadas1) para um vetor de interrupção que localiza o respectivo software do serviço de interrupção. Dessa forma o Sistema Operacional executa E/S gravando comando nos registradores da controladora. Em geral, muitos dos comandos têm parâmetros que também são carregados nos registradores das controladoras. Assim, quando o comando é completado, a controladora gera uma interrupção para permitir que o Sistema Operacional ganhe o controle da CPU e teste os resultados da operação. A CPU obtém os resultados e o status do dispositivo lendo um ou mais bytes de informação dos registradores da controladora. As interrupções são muito usadas em Sistemas Operacionais modernos para tratamento de eventos assíncronos, como um controlador que fica pronto para operações de E/S, falhas de hardware ou chamadas a rotinas do sistema, desviando o controle para o kernel. 1.5.1. FUNCIONAMENTO O hardware da CPU tem um fio chamado de linha de requisição de interrupções, que é testado pela CPU depois da execução de cada instrução. Quando a CPU detecta que um controlador enviou um sinal na linha de requisição de interrupções (provocou uma interrupção), ela armazena alguns poucos valores referentes ao seu estado na pilha do processo (PC, SP, etc) e desvia para uma rotina de tratamento de interrupções em um determinado endereço de memória. O tratador de interrupções realiza o tratamento necessário e executa uma instrução de retorno de interrupção, que faz a CPU retornar ao estado anterior a interrupção. Cada interrupção gera um endereço que, na maioria das arquiteturas, é usado como um índice em uma tabela (vetor de interrupções), que contém endereços de memória das rotinas de tratamento de interrupção. Tabela 1: Vetores de Interrupção Índice do Vetor 0 2 4 7 11 13 14 16 19-31 32-255 Descrição Erro de divisão Uso de apontador nulo Overflow Dispositivo não disponível Segmento ausente Acesso ilegal a posição de memória Página ausente Erro em operação em número em ponto flutuante Entrada reservada (Não use) Interrupções que podem ser desabilitadas Exemplos de interrupções que geram interrupções: 1 Nos computadores Pentium estão limitadas a 15 IRQ’s. 5 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br - Operações de E/S; - Tratamento de exceções (divisão por zero, endereço protegido); - Mecanismo de paginação; - Chamadas a rotina do núcleo (System Calls); - Gerenciamento do fluxo de execução do núcleo (permite que trabalhos urgentes sejam tratados primeiro). FAZENDO UMA LEITURA NO DISCO - Sistema Operacional informa à controladora que ela deve realizar uma leitura; - Controladora lê o bloco do disco serialmente, bit a bit, para o seu buffer interno; - Controladora calcula checksum; - Controladora gera interrupção; - Sistema Operacional lê o bloco do buffer e carrega na memória; - Tal operação gasta muito tempo do processador! INTERRUPÇÃO - Sinal gerado por um determinado hardware ou por software (TRAP) que faz com que a CPU pare aquilo que está fazendo e inicie outra atividade; - Controladoras usam interrupções para avisar sobre o término de uma operação de E/S; Figura 5 - Esquema de interrupção 1.6. Acesso Direto a Memória (DMA) Muitas controladoras, especialmente as de dispositivos de bloco, suportam DMA. Quando o DMA não está sendo utilizado, primeiro a controladora lê o bloco da unidade serialmente, bit a bit, até que o bloco inteiro esteja no buffer interno da controladora. Em seguida, é calculada a soma de verificação para certificar-se de que não ocorreram erros de leitura. Então, a controladora gera uma interrupção. Quando o sistema operacional começa a executar, ele pode ler o bloco de disco do buffer da controladora, um byte ou uma palavra por vez executando um 6 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br laço, com cada iteração lendo um byte ou uma palavra de um registrador da controladora de dispositivo e armazenando-o na memória. Dessa forma o laço programado para ler os bytes, um por vez, a partir da controladora desperdiça tempo da CPU. O DMA foi inventado para liberar a CPU desse trabalho de baixo nível. Quando é utilizado, a CPU fornece dois itens de informação para a controladora, além do endereço do bloco no disco: o endereço de memória para onde o bloco deve ir e o número de bytes a transferir. A controladora não pode copiar os dados diretamente para a memória, ela deve fazer uso de um buffer interno, visto que mesmo iniciada a transferência para a memória principal (MP) outros dados continuam entrando no disco; fazendo a bufferização desses blocos entrantes é possível liberar o barramento. Quando um bloco é bufferizado internamente o barramento não é necessário até que o DMA inicie. Outra razão da existência de um buffer interno é a possibilidade de realizar a verificação no próprio buffer antes de mandá-lo para a Memória Principal. Figura 6 - DMA No exemplo acima, a controladora DMA está embutida na controladora de disco. É possível, entretanto, utilizar controladoras DMA independentes. Figura 7 - DMA O processador precisa endereçar os controladores dos dispositivos para trocar dados com eles, por exemplo, requisitar dados um byte a cada vez. Depois que a controladora leu o bloco inteiro do dispositivo para seu buffer e verificou a soma de verificação, a controladora gera uma interrupção. Assim, quando o Sistema Operacional inicia, ele não precisa copiar o bloco para a memória, pois ele já está lá. 7 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br Nem todos os computadores utilizam DMA. O argumento contra é que a CPU principal é freqüentemente muito mais rápida que a controladora de DMA e pode fazer o trabalho muito mais rápido (Quando o fator limitante não é a velocidade do dispositivo de E/S). Se não houver outro trabalho para a CPU, mantê-la esperando o dispositivo DMA é algo sem sentido. ENTRADA E SAÍDA (E/S) - E/S Programada: CPU faz polling para verificar se o dispositivo está pronto; - E/S orientada à interrupção: Dispositivo avisa que está pronto através de uma interrupção; - E/S com DMA: CPU fica livre para fazer outras coisas e trata menos interrupções; 2. PRINCÍPIOS DE SOFTWARE DE ENTRADA E SAÍDA (E/S) A meta geral do software de entrada e saída é organizar o software como uma série de camadas, com as mais baixas preocupadas em esconder as peculiaridades do hardware das mais altas e estas últimas preocupadas em apresentar uma interface amigável, limpa e simples aos usuários. 2.1. Metas do Software de E/S Um conceito muito importante no projeto de software de E/S é conhecido por independência de dispositivo. Isso significa que é possível escrever um programa que faça a leitura em um disquete, CD-Rom, disco rígido, etc sem que seja necessário modificar os programas para cada tipo de dispositivo diferente. Cabe ao Sistema Operacional cuidar dos problemas causados pelo fato de que esses dispositivos realmente são diferentes e requerem drivers de dispositivo diferentes para realmente gravar os dados no dispositivo de saída. Outra meta é a atribuição uniforme de nomes, onde o nome de um arquivo ou de um dispositivo deve ser simplesmente uma string ou um número inteiro e não depender do dispositivo de nenhuma maneira. No UNIX todos os discos podem estar integrados juntos na hierarquia do sistema de arquivos de maneiras arbitrárias para que o usuário não precise saber qual nome correspondente a qual dispositivo. Exemplo: um CD-Rom montado no diretório /usr/backup. Outra questão muito importante é o tratamento de erros que deve ser realizado o mais próximo possível do hardware. Se a controladora descobrir um erro de leitura, ela deve tentar corrigir o erro se for possível, caso contrário o driver de dispositivo deverá tratá-lo lendo o 8 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br bloco novamente. Muitos erros são transitórios, às vezes causado apenas por sujeita na mídia. Somente quando as camadas mais baixas não conseguem resolver o problema é que as camadas mais altas devem ser informadas. Outro fator são as transferências síncronas (bloqueio) e assíncronas (interrupção). Em geral, a E/S é assíncrona – a CPU inicia a transferência e segue adiante para fazer outra coisa até a interrupção chegar. Os programas dos usuários utilizam muito a transferência síncrona depois de um comando READ, por exemplo, o programa é automaticamente suspenso até que os dados estejam disponíveis no buffer. O Sistema Operacional tenta fazer com que as operações baseadas em interrupção pareçam bloqueios para o usuário. Por fim, um último fator preponderante de software de E/S são os dispositivos compartilhados e os dedicados que fazem com que o Sistema Operacional precise saber como tratar uns e outros sem causar problemas. Todas as metas podem ser alcançadas estruturando o software de E/S em quatro camadas: Manipuladores de Interrupções Drivers de Dispositivo Software de SO independente de dispositivo Software de nível de usuário Figura 8 - Camadas do Software de E/S 2.2. Manipuladores de Interrupções O manipulador ou tratador de interrupções é uma parte do Sistema Operacional que cuida do tratamento das interrupções. As interrupções devem ficar bem ocultas dentro de um Sistema Operacional. Para isso, é preciso ter cada processo que inicia uma operação de E/S bloqueado até que a E/S tenha-se completado e a interrupção tenha ocorrido. Para tanto é necessário executar uma rotina de tratamento de interrupção propriamente dita e chamar o escalonador para decidir o próximo processo a executar (Semáforos). 2.2.1. TRATADORES DE INTERRUPÇÃO Tratadores de interrupção são parte do Sistema Operacional, usualmente bem escondidos. Tendo o driver iniciado uma operação de E/S o mesmo é bloqueado até que a operação se complete e uma interrupção ocorra, como por exemplo, operações sobre semáforos, recebimento de uma mensagem, etc. 9 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br Ocorrendo a Interrupção a rotina de interrupção faz sua tarefa. Em seguida libera o driver que iniciou a operação de E/S. Processar uma interrupção não é apenas interceptar uma interrupção, sinalizar o driver e executar um IRET, mas exige trabalho adicional realizado pelo Sistema Operacional. Figura 9 - Níveis do mecanismo de E/S Passos que devem ser realizados em software depois da interrupção ser completada: 1. Salvar registradores ainda não salvos por hardware; 2. Inicializar contexto para rotina de interrupção(TLB, MMU, tabela de páginas); 3. Inicializar pilha para rotina de interrupção; 4. Atender controlador de interrupções, reabilitar interrupções; 5. Copiar registradores de onde foram salvos (pilha) para tabela de processos; 6. Executar rotina de tratamento na qual extrai informações dos registradores do controlador do dispositivo que está interrompendo; 7. Escolher próximo processo a executar; 8. Estabelecer contexto MMU para próximo processo; 9. Carregar registradores do próximo processo (PSW); 10. Iniciar execução do processo. 2.3. Drivers de Dispositivo Todo código dependente de dispositivo deve estar nos drives de dispositivo. Estes devem tratar de um tipo de dispositivo, ou uma classe de dispositivos. Exemplo: Um único driver de terminal. O driver de disco é a única parte do sistema operacional que sabe quantos registradores tal controladora tem e para o que eles são utilizados. Sozinho ele sabe tudo sobre setores, trilhas cilindros, cabeçotes, movimento de braço, fatores de intercalação, unidades de motor, etc no trabalho de fazer o disco funcionar adequadamente. Em termos gerais, o trabalho de um driver de dispositivo é aceirar solicitações abstratas do software independente de dispositivo acima dele e cuidar para que a solicitação seja executada. 10 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br No geral, o trabalho de um driver de dispositivo é aceitar solicitações abstratas do software independente do dispositivo acima dele e cuidar para que a solicitação seja executada. Para que isso seja executado em um disco, o primeiro passo é traduzi-la de um termo abstrato para um termo concreto – isso significa descobrir onde no disco o bloco requerido realmente está e em seguida gravar nos registradores de dispositivos da controladora. Para que esse trabalho ocorra é necessária a emissão de alguns comandos. Estes por sua vez, após a consecução do comando bloqueia a si próprio até que as interrupções entrem para desbloqueá-lo. Figura 10 - Camadas 2.4. Software de Sistema Operacional independente de dispositivo Embora parte do software de E/S seja específico do dispositivo, uma grande parte dele é independente do dispositivo. Esta divisão depende do sistema, visto que algumas funções que poderiam ser feitas de uma maneira independente de dispositivo podem, na realidade, ser feitas nos drivers. Funções geralmente realizadas pelo software independente de dispositivo: - Interfaceamento uniforme para drivers de dispositivo; - Nomeação de dispositivo; - Proteção de dispositivo; 11 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br - Fornecimento de um tamanho de bloco independente de dispositivo; - Bufferização; - Alocação de armazenamento em dispositivos de bloco; - Atribuição e liberação de dispositivos dedicados; - Informe de erros. No MINIX a maioria do software independente de dispositivo é parte do sistema de arquivos. Sua função básica é executar as funções de E/S que são comuns para todos dispositivos e oferecer uma interface uniforme para o software de nível de usuário. Cuida ainda de realizar o mapeamento de nomes simbólicos de dispositivos e de sua proteção. O sistema impede que os usuários acessem dispositivos aos quais eles não têm direitos de acesso. No UNIX, um esquema mais flexível é utilizado. Os arquivos especiais correspondentes aos dispositivos de E/S são protegidos pelos bits rux normais. O administrador de sistema pode, então, configurar as permissões adequadas para cada dispositivo. Discos diferentes podem ter tamanhos de setor diferentes. Cabe ao software independente de dispositivo esconder esse fato e oferecer um tamanho uniforme de bloco. A bufferização também é uma questão, tanto para dispositivos de bloco como para os de caractere. A entrada de teclado que chega antes de ser necessária também requer bufferização. O tratamento de erros, de modo geral, é feito pelos drivers. A maioria dos erros é altamente dependente do dispositivo; então, somente o driver sabe o que fazer (ex.: tentar novamente, ignorar, pane). Um erro típico é causado por um bloco de disco danificado que não pode ser mais lido. Depois que o driver tentou ler o bloco certo número de vezes, ele desiste e informa ao software independente de dispositivo. A maneira como o erro é tratado daqui é independente de dispositivo. Se o erro ocorreu durante a leitura de um arquivo de usuário, pode ser suficiente informar o erro ao processo que registrou a leitura. Entretanto, se ele ocorreu durante a leitura de uma estrutura de dados crítica do sistema, como o bloco que contém o mapa de bits mostrado quais blocos estão livres, o sistema operacional não pode ter outras escolha senão imprimir uma mensagem de erro e terminar. 2.5. Software de E/S no Espaço do Usuário Embora a maioria do software de E/S esteja dentro do Sistema Operacional, uma pequena parte consiste em bibliotecas vinculadas em programas de usuário e até mesmo programas inteiros que executam fora do kernel. Uma biblioteca-padrão de E/S contém diversos 12 SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br procedimentos que envolvem E/S e todas executam como parte de programas de usuário. Contudo, nem todo software de E/S no nível de usuário consistem em procedimentos de biblioteca. Um exemplo é o sistema de spool. Fazer spool é uma técnica de lidar com dispositivos dedicados de E/S em um sistema de multiprogramação. Embora pudesse ser uma técnica fácil deixar que qualquer processo de usuário abrir o arquivo especial de caractere para a impressora, suponha que um processo abrisse-o e, então não fizesse nada durante horas. Nenhum outro processo poderia imprimir qualquer coisa. A técnica de spool não é utilizada somente para impressoras. Ela também é utilizada em outras situações, como transferência de arquivos. A figura abaixo resume o sistema de E/S, mostrando todas as camadas e as principais funções de cada uma. As setas mostram o fluxo de controle: Figura 11 - Sistema de Entrada e Saída Quando um programa de usuário tenta ler um bloco de um arquivo, por exemplo, o Sistema Operacional é invocado para executar a chamada. O software independente de dispositivo olha no cache de blocos. Se o bloco necessário não estiver aí, ele chama o driver de dispositivo para enviar a solicitação ao hardware. O processo, então, é bloqueando até que operação de disco seja concluída. Quando o disco termina, o hardware gera uma interrupção. O manipulador de interrupções é executado para descobrir o que aconteceu, isto é, qual dispositivo quer atenção imediatamente. Então, ele extrai o status do dispositivo e acorda o processo adormecido para terminar a solicitação de E/S e deixar o processo de usuário continuar. 13