1. Mapeamento E/S
1.1. Controladores que se comunicam com a CPU através de registradores
1.1.1. Ao escrever nesses registradores o SO pode tomar controle sobre o dispositivo e realizar ações com ele
1.1.2. Ao ler esses registradores o SO pode descobrir como está o dispositivo
1.2. Controladores que tem buffer de dados
1.2.1. O SO pode ler e escrever partindo desse buffer
1.2.2. Ex: O SO pode escrever no buffer de vídeo qual as informações que formarão imagem
1.3. Como se da na pratica a comunicação usando os registradores
1.3.1. Cada registrador de controle receberá um código de 8 ou 16 bits e cada código desse representa uma porta para um device E/S
1.3.2. Um conjunto dessas portas forma o espaço E/S onde o SO ira interagir com o dispositivo
1.4. E/S mapeada na memória
1.4.1. Para cada registrador de controle é designado um espaço de memória único e que esteja livre, esse método tem uma grande vantagem com relação a proteção dos dados, mas tem como desvantagem a impossibilidade do SO desativar o cache e o problema de performance derivado a necessidade de buscar em todos os espaços para saber se o dispositivo está disponível ou não
2. Acesso direto á memória (DMA)
2.1. Caso a CPU solicite cada byte por vez de um dispositivo E/S, um bloco de dados muito grande pode ser gerado e isso desperdiçaria muito tempo de CPU
2.2. Para isso é criado o DMA no hardware onde cada dispositivo pode ter um controlador desses a a placa mãe tem apenas 1 para conectar com os dos dispositivos
2.3. Um DMA é composto por um registrador de espaços de memória, um contador de bytes e um ou mais registradores de controle
2.4. Como a CPU é muito mais rápida que p DMA ele limita a comunicação e a troca de dados, além disso, ter todo essa otimização via software torna os computadores mais baratos
3. Interrupções
3.1. Quando um dispositivo E/S finaliza seu trabalho ele gera uma interrupção e manda um sinal no barramento e fica a cargo do controlador decidir como ira reagir a esse sinal
3.2. Ele pode processar essa interrupção ou ignorar o sinal caso tenha outra interrupção em andamento
3.3. No caso de tratar a interrupção o controlador coloca o numero de linhas de endereços do barramento do dispositivo que quer atenção e passa o sinal para a CPU
3.4. Em sistemas mais antigos o PC, program counter, é colocado em uma lista e a rotina da interrupção se inicia, quando se encerra o PC é retomado. Ele parte do pressuposto que todas as instruções anteriores a interrupção foram executadas e em sistemas modernos baseados em pipelines as interrupções são tratadas em threads diferentes
3.5. Em alguns casos a interrupção é imprecisa, ou seja, ela não atende aos requisitos para ser executada corretamente e para esses casos é possível usar uma abordagem hibrida para tratar desse tipo de interrupção
4. Introdução
4.1. O SO pode interagir com dispositivos E/S de diversas forma
4.2. Emitindo comando, interceptando interrupções e lidando com os erros
4.3. De modo que ele fornece uma interface simples entre os dispositivos E/S e o resto do sistema e ,na medida do possível, a interface é a mesma para os diferentes tipos de dispositivos
5. Dispositivos E/S
5.1. Classificação geral
5.1.1. Dispositivos de blocos
5.1.1.1. Armazenam dados em blocos de tamanho fixo e cada um deles tendo seu próprio endereço
5.1.1.2. cada bloco pode ser lido ou escrito de maneira independente
5.1.1.3. Disco rígido e Blu-ray são exemplos desse tipo de dispositivos
5.1.2. Dispositivos de caractere
5.1.2.1. Funciona baseado em um fluxo de caracteres tendo saindo quanto chegando ao dispositivo e desconsidera a estrutura de blocos
5.1.2.2. Não é endereçável e não permite qualquer tipo de operação de busca
5.1.2.3. Impressora e mouse são exemplos desses dispositivos
5.2. Controlando os dispositivos
5.2.1. Unidades E/S normalmente dispõem de um componente mecânico, que é a unidade em si, e um componente eletroeletrônico, que pode ser chamado de controlador ou adaptador
5.2.2. Esse método permite uma implementação bem modular para o controle
5.3. Controladores
5.3.1. Alguns padrões como ANSI, IEEE, ISO ajudam a permitir a produção de controladores para dispositivos que tenham ampla compatibilidade como o controlador SATA e USB
5.3.2. Alguns controladores como o controlador de disco e de um monitor LCD tendem a ser construído usando usando códigos de muito baixo nível, já que eles vai analisar e trabalhar encima de cada byte