Gestão de dispositivos: Princípios de I/O hardware: Componentes principais de um computador: cpu, memorias (primário e secundária)e sistemas de I/O. Os dispositivos de I/O são divididos em 2 categorias: • Dispositivos de bloco (estruturados): armazenam informação em blocos de tamanho fixo; (tamanhos típicos: 128-1024 bytes) cada qual com o seu endereço próprio; possibilitam a leitura ou escrita de cada bloco separadamente; ex: discos (discos rigido, cd-rom, disquete, etc.) • Dispositivos de caracter: Liberam ou aceitam sequências de caracteres sem nenhuma estrutura de bloco; Não são endereçáveis e não aceitam operação de seek. Ex: terminais, impressoras, interfaces de rede, mouses
Comunicação: • Acesso de memória directo - DMA: é uma característica essencial dos
•
computadores modernos. Permite que os dispositivos transfiram dados sem sobrecarregar a CPU. De outra maneira, a CPU teria que copiar todos os dados da fonte até o destino. Isto é tipicamente mais lento do que copiar blocos de dados dentro da memória, já que o acesso a dispositivo de I/O através de barramentos periféricos é mais lento que a RAM. Durante a cópia dos dados a CPU ficaria indisponível para outras tarefas. Uma transferência por DMA essencialmente copia um bloco de memória de um dispositivo para outro. A CPU inicia a transferência, mas não executa a transferência. Para os chamados third party DMA, como é utilizado normalmente nos barramentos ISA, a transferência é realizada pelos controladores DMA que são tipicamente parte do chipset da placa mãe. Projetos mais avançados de barramento, como o PCI, tipicamente utilizam bus-mastering DMA, onde o dispositivo toma o controle do barramento e realiza a transferência de forma independente. Um uso típico do DMA ocorre na cópia de blocos de memória da RAM do sistema para um buffer de dispositivo. Estas operações não bloqueiam o processador que fica livre para realizar outras tarefas. Transferências DMA são essenciais para sistemas embarcados de alto desempenho. Também é fundamental na implementação de drivers de periféricos, roteamento de pacotes de rede, execução de áudio e vídeo por streaming.
Mapeamento em espaço de E/S, o processador possui instruções de máquina próprias para operações de E/S e estas instruções especificam registradores de periféricos. Nesse tipo de processador existem dois espaços de endereçamento distintos: o espaço normal, que corresponde à memória principal e o espaço de E/S, que corresponde aos registradores dos periféricos. Um conjunto de instruções (do estilo load, store, move) acessa a “memória normal” e outro conjunto (as instruções de E/S, do estilo in e out) acessa a “memória de E/S”. Enquanto a instrução move end,dado representa escrever dado na posição de memória end, a instrução out end,dado representa escrever dado no registrador de algum dispositivo. Observe que, numericamente, o valor de end pode ser o mesmo nos dois casos, o que faz a diferença é a instrução empregada. No mapeamento em memória, o espaço de endereçamento é único (só existe uma memória), mas alguns endereços representam registradores de (controladores de) periféricos. Em tempo de projeto do computador, são reservados alguns endereços da memória principal para representar registradores de periféricos. Esses endereços não corresponderão a palavras de memória, mas sim a registradores de dispositivos. Com essa técnica, qualquer periférico pode ser programado através de instruções de acesso à memória do estilo mov end,dado. Se end é um endereço correspondente a um controlador de dispositivo, o dado será escrito no registrador do dispositivo (o valor de dado será interpretado segundo a função específica desse registrador).
Nos subsistemas de I/O temos de considerar as características de dispositivos: • Taxa de Transmissão: Termo utilizado para a velocidade de transmissão de
dados. É expresso em bits por segundo (Kbps, Mbps, etc.);
• • • • •
Complexidade de controlo; Unidade de transferência Representação de dados ( códigos de erro, convenções de paridade) Condições de erro: consequências e gama de resposta Aplicações:
Organizações de funções de I/O: • Via polling: se chegou dados, deve ser lido. Como saber se tem dados? Criar um programa que monitora esta saida serial? Ou monitorar os registradores de status! Temos o TX e RX, similar a ideia do modem! O processador emite um comando de
I/O em nome de um processo.O processador ocupado espera para conclusão da operação antes do seguinte. • via interrupção: Neste caso o dispositivo de I/O, “ avisa” , interrompendo a CPU,
sinalizando a necessidade. Então a CPU para sua execução de programa e trabalha com a leitura do caracter de I/O.Este controlo é assíncrono.
•
via interrupção:O uso do mecanismo de interrupção elimina a necessidade de polling em
operações de E/S. Nesse caso tem-se E/S via interrupções (interrupt driven I/O). Nessa situação, o processador é responsável – via software – apenas por iniciar uma operação de E/S enviando comandos à interface (controlador). Após, o processador passa a executar outra tarefa, e o controlador, a operação de E/S. Quando a operação de E/S termina, o controlador interrompe o processador, provocando a execução do tratador de interrupção, o qual irá acionar o driver do dispositivo.
• DMA: Muitos controladores, especialmente os que operam em blocos, suportam DMA. Vejamos primeiro como discos operam sem DMA. Primeiro, o controlador lê serialmente o bloco (um ou mais setores) do dispositivo, bit a bit, até que este seja transferido para o buffer interno do controlador. Depois, o controlador executa a operação de checksum para atestar que o bloco está livre de erros. Quando o sistema operacional reassume a CPU, ele pode ler o bloco do buffer do controlador (byte a byte ou palavra a palavra) numa operação cíclica, onde em cada ciclo um byte ou palavra é transferido do controlador para a memória. • DMA: O emprego de interrupções resolve o problema de determinar o momento exato em que um dispositivo de E/S necessita da atenção do processador, entretanto não auxilia na execução de outra tarefa bastante importante em operações de E/S: a transferência de dados. Para a maioria dos periféricos, o processador é responsável pela leitura de dados na interface e por sua transferência à memória, ou pela leitura na memória e transferência para a interface. Quando o volume de dados é importante, esse procedimento torna-se ineficiente, pois, além de envolver o processador, essa transferência representa dois movimentos de dados: um da interface ao processador, e outro do processador à memória. Uma solução para isso é transferir diretamente os dados da interface para a memória, o que é conseguido por um mecanismo conhecido como DMA (Direct Memory Access). A técnica de DMA baseia-se no emprego de um hardware especial, o controlador de DMA, para realizar a transferência de dados entre um dispositivo e a memória. Para tanto, o controlador de DMA possui a capacidade de acessar diretamente a memória, sendo então conectado fisicamente ao barramento de dados e de endereços do computador. O controlador de DMA possui internamente uma série de registradores utilizados pela UCP para programar a transferência de dados. Tipicamente, tem um par de registradores para o armazenamento dos endereços fonte e destino da transferência, um registrador que determina quantos bytes devem ser transferidos, um registrador de comando e um de estado. Após acionar o DMA, o processador pode se dedicar a outra tarefa. No término da transferência, o controlador de DMA sinaliza o processador através de uma interrupção de hardware. A técnica de DMA é mais eficiente que as discutidas anteriormente quando a operação de E/S envolve a leitura (ou escrita) de muitos dados, como, por exemplo, uma leitura de disco ou a recepção de uma mensagem em uma rede local. É importante observar que tanto o controlador de DMA quanto o processador competem para acessar à memória (não esqueça que o processador está executando outras tarefas, o que envolve
sem dúvida acessos à memória). Essa disputa pelo acesso à memória é coordenada pelo que se denomina arbitramento do barramento. Como o mecanismo de acesso à memória passa a ser compartilhado, o processador (durante o funcionamento do DMA) irá executar a uma velocidade menor que a normal. Mesmo assim, esse método será ainda mais eficiente do que usar diretamente o processador para realizar a transferência
Princípios de Softwares de Entrada/Saída • O objetivo do software é esconder dos usuários as peculiaridades do hardware, apresentando uma interface boa e simples. • Independência de dispositivos. ( um arquivo em disquete pode ser tratado do mesmo jeito de um arquivo armazenado no disco) • Manipulação de erros. Os erros devem ser tratados no nível de hardware ou muito próximos. Grande parte dos erros são transientes e uma nova tentativa de acesso pode eliminá-los. • Transferência síncrona e assíncrona Resumindo, os softwares podem ser estruturados da seguinte forma: ⇒ Manipuladores de interrupção ⇒ Drivers de dispositivos ⇒ Softwares do sistema operacional independente do dispositivo ⇒ Software do nível do usuário Manipulação de Interrupção • As Interrupções devem ficar localizadas nos níveis mais baixos do SO • Melhor maneira de escondê-las, todo processo que inicie operação de E/S deve ficar bloqueado até o término das operação de E/S. Auto-bloqueio com um DOWN em um semáforo, WAIT numa variável de condição ou um RECEIVE em uma mensagem. • Quando ocorrer a interrupção, a rotina de interrupção deve tentar desbloquear o processo que iniciou a operação. Basta um UP no semáforo, ou um SIGNAL numa variável de condição de um monitor.
Drivers de Dispositivos • Todo código que depende do dispositivo está no driver de tal dispositivo. • Cada driver manipula um tipo de dispositivo, ou no máximo uma classe de dispositivos semelhantes. • O driver é a única parte do sistema operacional que conhece o número de registradores da controladora e para que servem. • Em termos gerais, o trabalho do driver de dispositivo é o de aceitar requisições abstratas por parte do software dependente do dispositivo, que roda acima dele. • O driver pode autobloquear após a emissão de um comando aguardando por uma interrupção do dispositivo para despertar, ou pode não necessita bloquear porque o comando é atendido imediatamente.
Softwares de Entrada/Saída independente do Dispositivo Funções a serem executadas por softwares independentes de dispositivos: Interface uniforme para os drivers de dispositivo Identificação do dispositivo Proteção do dispositivo Fornecimento de um tamanho de bloco independente do dispositivo Bufferização Alocação de espaço para blocos Alocação e liberação de dispositivos dedicados Informação de erro • Objetivo básico: fornecer interface uniforme para o nível de software de usuário pela realização de funções de entrada/saída que são comuns a todos os dispositivos. • Os softwares independentes de dispositivos tem a função de mapear o nome simbólico do dispositivo para o driver específico. Por exemplo, /dev/tty0, especifíca um i-node de um arquivo especial que contém um número do dispositivo principal, que serve para localizar o driver apropriado. O i-node contém também o número do dispositivo secundário, que é passado como parâmetro para o driver, especificando a unidade a ser lida ou escrita. • No unix a proteção aos arquivos especiais, correspondentes aos dispositivos de e/s é feita por bits rwx. • A bufferização é muito importante, tanto para dispositivos de blocos como de caracteres. • Unidades como fita magnética, podem ser solicitadas por mais de um processo simultaneamente, o sistema operacional é responsável pela alocação a somente um processo de cada vez. A manipulação de erros é feito quase na sua totalidade pelos drivers.
Camadas do sistema I/O
Aplicações de interfaces de I/O: • Caracter-fluxo ou bloco • Sequencial ou com acesso directo • Síncrono ou assíncrono • Partilhado ou dedicado • Velocidade de operação • Leitura/escrita, só lê, só escreve