# Sistemas operacionais/Gerência de dispositivos de entrada e saída

Uma das principais funções do Sistema Operacional é gerenciar os dispositivos de Entrada e Saída (E/S) ligados ao computador.
É tarefa do sistema operacional enviar sinais, informando as ações que o usuário espera que o dispositivo realize; tratar as interrupções e erros gerados pelos dispositivos.
Existem duas visões sobre o hardware de E/S: A dos engenheiros, que os vêem como chips, ligações elétricas, etc. E a visão dos programadores, que vêem uma interface de programação para se comunicar com o dispositivo.

## Controladores de dispositivos

Dispositivos de hardware precisam ser controlados para proporcionar a entrada e saída de dados para o processador. O controle do hardware é realizado por meio de hardware e software apropriados.
A porção de hardware é denominado controlador de hardware e segue padrões determinados pelo barramento (IDE, SCSI, USB, etc), assim, ligados a cada tipo de barramento existem controladores de hardware: controladora de hardware IDE, controladora de hardware SCSI, etc.
Para utilizar um dispositivo de hardware, é necessário conectá-lo a interface física da controladora de hardware. Por exemplo, um disco rígido IDE deve ser conectado a uma das quatro interfaces disponíveis pela controladora IDE. Em geral, o Sistema Operacional pode ter softwares controladores de dispositivo (driver de dispositivos). Os drivers de dispositivos para a controladora de hardware, geralmente são genéricos, embutidos no próprio Sistema Operacional. E os drivers para dispositivos de hardware são geralmente específicos, uma vez que controlam funcionalidades específicas providas pelos fabricantes.
Periférico é dado como qualquer dispositivo de hardware conectado a um computador de forma a permitir a sua interação com o mundo externo.

## Princípios do software de E/S
### Independência do dispositivo

Esse conceito trabalha sobre a possibilidade de escrever programas capazes de acessar um dispositivo E/S sem que seja necessário um conhecimento prévio sobre qual é o dispositivo. Portanto, um programa deverá ser capaz de ler/escrever um arquivo da mesma forma para qualquer dispositivo. Para o caso de se obter a entrada de um dispositivo para saída em outro - como em "/dispositivo1/arquivo > /dispositivo2", o Sistema Operacional fica incumbido de tratar dos problemas causados pelo fato de os dispositivos serem desiguais e necessitarem de sequências de comandos muito diferentes para leitura e escrita.

### Nomeação uniforme

O nome de um arquivo ou de um dispositivo deveria ser uma cadeia de strings ou um número inteiro totalmente independente do dispositivo. Dessa forma, os arquivos e diretórios são endereçados pelo nome do caminho.

### Tratamento de erros

De maneira geral, espera-se que os erros, como de leitura por exemplo, sejam tratados em níveis mais baixos, o mais próximo do hardware.

### Tipos de conexão e de transferência de dados

Os dispositivos I/O podem se conectar de forma serial ou paralela. Na interface serial existe apenas uma linha por onde os dados trafegam. Na interface paralela os dados são transmitidos simultaneamente através das várias linhas para dados, a quantidade de linhas é um múltiplo de 1 byte (8 bits).
As informações sobre os endereçamentos de I/O ficam armazenadas, Sistema Operacional Linux, no arquivo /proc/ioports
A transferência pode ser síncrona (bloqueante) - após um read, o programa é suspenso até que os dados estejam disponíveis no buffer, ou assíncrona (orientada à interrupção) - a CPU inicia uma transferência e segue realizando outra atividade até ser sinalizada por um interrupção (o que acontece na maioria das E/S físicas).

### Software de E/S

O principal objetivo do software gerenciador de E/S é padronizar ao máximo o acesso e controle dos dispositivos, permitindo a inserção de novos dispositivos no sistema computacional sem a necessidade de um outro software auxiliar. Isso se torna uma tarefa bastante complicada devido à grande variedade, complexidade e particularidades dos dispositivos periféricos encontrados. Para facilitar isso, o software de E/S é geralmente é dividido em camadas. Cada camada tem uma função bem definida para executar e uma interface também bem definida para as camadas adjacentes, por meio de uma serie de operações comuns a todos os dispositivos. Uma forma de implementação dessa estrutura é dividir o software em quatro camadas, onde temos a camada superior sendo a E/S vista pelo usuário; a segunda camada o software que enxerga E/S da mesma forma, independente do dispositivo; a terceira camada serve como interface padrão para drivers, e a ultima (mais inferior), composta pelos drivers propriamente ditos.

### Utilização de buffer

O buffer pode ser utilizado em momentos em que os dados não podem ser armazenadas em seu destino final - como acontece com os pacotes que são recebidos pela rede e que precisam ser examinados. Outro exemplo são os dispositivos que apresentam restrições de tempo real, em que os dados devem ser antecipadamente colocados em um buffer de saída a fim de separar a taxa com a qual o buffer é preenchido.Essa taxa é calculada a partir da taxa com a qual ele é esvaziado. Dessa forma, evita-se a sobreposição do buffer.

### Dispositivos compartilhados vs dedicados

Alguns dispositivos, como discos, podem ser usados por vários usuários simultaneamente. Outros, como dispositivos de fita, devem ser dedicados a um usuário até que este termine sua tarefas. O Sistema Operacional deve ser capaz de tratar ambos, de forma a evitar problemas.

### Impasses (Deadlock)

Como dito anteriormente, alguns dispositivos devem ser dedicados a um usuário até que este termine sua tarefa, não podendo ser interrompido para atender a solicitação de outro processo. Quando dois processos alocam recursos para si de forma que nenhum dos dois possa realizar a tarefa, mas também nenhum dos dois disponibilizam estes recursos antes de realizar a tarefa estes processos encontram-se em um impasse (deadlock) e permaneceram ali até que um fator externo os retire dessa situação. O princípio básico do impasse é descrito formalmente: Um conjunto de processos está em um impasse se cada processo do conjunto está esperando um evento que somente outro processo do conjunto pode causar. Como todos os processo estão esperando, nenhum deles jamais causará qualquer dos eventos que poderiam acordar qualquer dos outros membros do conjunto e todos os processos continuam a esperar eternamente.

## Dispositivos de Entrada e Saída

Dispositivos de entrada e saída também chamados de dispositivos de I/O e são classificados em três tipos: Caractere, Bloco, Pseudo-dispositivos.
Essa classificação não é 100% abrangente, uma vez que relógios (temporizadores) em hardware não podem ser classificados em nenhum destes tipos.
Tais dispositivos se interagem com o SO através de interrupções que podem ser tratadas pelo proprio SO para que seus dados de I/O sejam encaminhadas corretamente.
Nem todos os dispositivos de E/S se enquadram nessas duas categorias, por exemplo o relógio que apenas gera sinais de interrupção. Tal dispositivo trabalha em uma ampla variação de velocidade, o que impõe uma considerável pressão sobre o software, que deve trabalhar bem diante das mais diferentes ordens de magnitude de velocidade.

### Dispositivos de Caractere

Os conhecidos dispositivos do tipo dispositivos de caracteres são assim chamados por terem sua comunicação feita através do envio e recebimento de um fluxo de caracteres. São usados, muitas vezes, para comunicação com dispositivos de interface serial. Geralmente as implementações desse tipo priorizam a eficiência da comunicação em vez do seu volume, neste sentido, é feita de forma não "bufferizada", sendo assim cada caracter é lido/escrito no dispositivo imediatamente [necessita citação]. A exemplo de dispositivos de caracteres que priorizam a comunicação e não necessitam de buffer temos o teclado e o mouse.A exemplo de dispositivos de caracteres que já priorizam o volume ao invés da comunicação temos a impressora, devido a quantidade de dados que chega ser bem maior que sua velocidade de impressão, logo possui um buffer de impressão.
Dispositivo de caracteres: É aquele que envia/recebe um fluxo de caracteres, sem considerar qualquer estrutura de blocos, eles não são endereçáveis e não dispõe de qualquer operação de posicionamento. Impressoras e mouses são exemplos desses dispositivos.

### Dispositivos de Bloco

Os dispositivos do tipo dispositivos de bloco são similares aos dispositivos do tipo caractere, porém com uma diferença: O modo de transmissão dos dados, que é feita na forma de blocos. São dispositivos que a comunicação é feita por meio de blocos de dados como em HD's, drivers de CD-ROM, flash drivers e dispositivos de armazenamento em geral.
Outra grande diferença é que os dispositivos de bloco em geral utilizam operações de entrada/saídas bufferizadas, no sentido de otimizar o desempenho da transferência de dados. O Sistema Operacional aloca um buffer em um tipo de memória para transferir blocos para cada processo de Entrada e Saída (E/S). Quando um processo envia/requisita dados para/de um dispositivo, o buffer deve ser preenchido para concluir a operação de E/S. Ao encher, o buffer completo é transferido e esvaziado para que seja liberado para uma nova operação.
Dispositivo de blocos é aquele que armazena informação em bloco de tamanho fixo, cada um com seu próprio endereço. O tamanho dos blocos normalmente variam de 512 bytes a 32 K bytes. A propriedade essencial de um dispositivo de blocos é que cada bloco pode ser lido/escrito independente dos outros. Discos, são exemplos desses dispositivos.

### Pseudo-Dispositivos

Em sistemas do tipo UNIX, arquivos de dispositivo especiais podem não possuir um dispositivo físico correspondente, estes são chamados de "pseudo-dispositivos".
Ex: /dev/null (recebe dados a serem descartados, como uma 'lixeira') , /dev/random (gera números aleatórios) , /dev/zero (gera valores com valor 'zero', útil para criar arquivos preenchidos com esse valor).

## Interrupção
### Pedido de Interrupção (IRQ)

O Sistema Operacional (SO) chaveia entre os aplicativos ativos para que o usuário tenha a sensação de que estes estão executando em paralelo. O SO permite que um aplicativo utilize o processador durante um determinado período de tempo e então permite que outra aplicação o utilize. Como o chaveamento é feito de uma forma muito rápida temos a impressão de que os aplicativos estão sendo executados ao mesmo tempo.
Um pedido de interrupção (abreviação IRQ (em inglês)) é a forma pela qual componentes de hardware requisitam tempo computacional da CPU. Um IRQ é a sinalização de um pedido de interrupção de hardware.
Por exemplo: caracteres digitados no teclado, operações de leitura sobre o HD, dados recebidos pelo modem ou mesmo movimentos do mouse devem ser executados mesmo que a máquina esteja processando alguma tarefa.
Dessa forma IRQ´s são canais de comunicação com o processador. Ao receber um pedido através de algum destes canais, o processador percebe a solicitação de interrompimento de um dispositivo.
Quando um programa de usuário emite uma chamada ao sistema, esta é encaminhada ao driver apropriado. Para evitar que a CPU fique ocupada interrogando se dispositivo terminou a operação de E/S (espera ociosa), o driver pede ao dispositivo que lhe sinalize quando isso ocorrer. Dessa forma, o Sistema Operacional poderá executar outras tarefas enquanto o programa que o chamou pedindo o serviço se encontra bloqueado. Ao final da operação, o controlador do dispositivo gera uma interrupção, ao chip controlador de interrupção, para sinalizar à CPU.
Caso nenhuma outra interrupção esteja pendente ou em tratamento e nenhum outro dispositivo fez uma requisição de maior prioridade no mesmo momento, a interrupção é tratada imediatamente. Caso contrário, ela é ignorada, e o dispositivo continuará emitindo sinal de interrupção.
Após executar uma instrução, a CPU verifica as linhas de interrupções para saber se alguma interrupção foi sinalizada
Caso tenha sido sinalizada uma interrupção, o hardware grava os registradores da CPU na pilha do programa que estava em execução e carrega o contador de programa com o endereço da rotina referente à interrupção sinalizada
Interrupções podem ser geradas por hardware ou por software. No caso do hardware, pelo dispositivos periféricos ou pelo relógio (timer). As interrupções geradas por software são conhecidas como system calls (chamadas ao sistema) ou trap (armadilha). A diferença primordial entre as interrupções geradas por software e as geradas por hardware, está no fato de que, conhecendo um programa e seus dados, é possível prever quando as interrupções de software irão acontecer - o que não é possível no caso das interrupções de hardware.

### Interrupções revisitadas

Em hardware, as interrupções trabalham da seguinte forma: quando um dispositivo de E/S finaliza seu trabalho ele gera uma interrupção, enviando um sinal pela linha do barramento à qual está associado. O sinal é detectado pelo chip controlador de interrupção localizado na placa mãe, o qual decide o que fazer. Caso esse chip esteja em uso por outro sinal de interrupção ou seja enviado para esse chip outro sinal de maior prioridade, o sinal é posto em uma fila para quando o chip ficar ocioso ele tratar esse sinal.
O hardware sempre salva certas informações antes de iniciar a rotina de tratamento da interrupção; no mínimo, o contador de programas (PC) deve ser guardado.
Existem duas categorias de interrupções:
* Interrupção precisa → Deixa a máquina em um estado bem definido. Possui 4 propriedades:
** 1. O contador de programa é salvo em um lugar conhecido;
** 2. Todas as instruções anteriores àquela apontada pelo PC foram totalmente executadas;
** 3. Nenhuma instrução posterior à apontada pelo PC foi executada;
** 4. O estado de execução da instrução apontada pelo PC é conhecido.
* Interrupção imprecisa → Deixa a máquina em um estado não bem definido, pois tem concorrência interna. Complica bastante a vida do projetista do SO, que se vê então obrigado a calcular o que já foi executado e aquilo que ainda não foi executado, para isso é necessário guardar muito mais informação que o normal.

### Tratadores de interrupção

As interrupções deveriam ser escondidas para que a menor parte possível do SO soubesse de sua existência. A melhor maneira é bloquear o driver que iniciou uma operação de e/s até que a e/s se complete e uma interrupção ocorra.
O efeito resultante da interrupção fará com que o driver previamente bloqueado esteja novamente apto a executar. Esse modelo funciona bem sempre que os drivers são estruturados como processos do núcleo do sistema operacional, com seus próprios estados, suas pilhas e seus contadores de programa.

### Interrupções em sistemas Linux

Em antigos computadores, existiam apenas 8 interrupções de hardware. Nos atuais, existem 16 tipos de interrupções de hardware, numeradas de 0 a 15.
As interrupções que ocorrem em computadores Linux podem ser vistas digitando no shell o comando:
$ cat /proc/interrupts
0 = É o timer do SO.
1 = Interrupção de teclado.
2 = Funciona como ponte para a interrupção 9, e é advinda dos antigos computadores com apenas 8 IRQ's. Dessa forma, ela permite que esses computadores sejam utilizáveis, quando for necessário uso da interrupção 8 para cima.
3 = geralmente usada pela ttyS1, podendo ser usada por outros dispositivos como placas de rede.
4 = geralmente usada pela ttyS0. Quando é usado um mouse serial, ele trabalho através dessa IRQ.
5 = É a segunda porta paralela. Como muitos computadores não possuem essa porta, ela é muito usada pela placa de som.
6 = Usada pelo controlador de disquete
7 = Antigamente, era a primeira porta da impressora. Atualmente várias impressoras não usam IRQ's.
8 = Relógio
9 = Ponte com a IRQ2.
10 = É uma interrupção geralmente livre. Geralmente usada por controladores USB.
11 = Outra interrupção livre
12 = Mais uma IRQ livre. Quando há um mouse PS/2, é trabalhada essa IRQ
13 = Processador de dados numérico.
14 = Usada pela primeira controladora de discos rígidos.
15 = Usada pela segunda controladora de discos rígidos.
Convém citar que as IRQ's 14 e 15 não podem ser compartilhadas, devido ao alto grau de importância das mesmas.
Os dispositivos PCI/PCI Express são feitos para permitir o compartilhamento de interrupções. Esse trabalho de compartilhamento pode ser feito pelo chipset.

## Uso de memória por dispositivos
### E/S mapeada na memória

Cada controlador tem alguns registradores usados para a comunicação com a CPU. Por meio da escrita nesses registradores, o SO pode comandar o dispositivo para entregar ou aceitar dados, alternar em ligar/desligar, ou ainda executar alguma outra tarefa. A partir da leitura desses registradores o SO pode descobrir o estado do dispositivo, se ele está preparado para aceitar um novo comando, etc. Além dos registradores, usualmente os dispositivos também possuem um buffer.
Existe duas formas para a CPU ter acesso a esses registradores e buffers:
* 1º → Cada registrador de controle é associado a um número de porta de E/S, usando uma instrução especial de E/S (IN REG, PORT OUT REG, PORT) que seria um acesso direto.
* 2º → Mapear todos os registradores de controle no espaço de endereçamento da memória. Cada registrador de controle é associado a um endereço de memória único ao qual nenhuma memória é associada, que seria o mapeamento da E/S na memória.
Essa segunda forma, nos traz duas grandes vantagens, a primeira é que o programador pode tratar esses registradores como se trata a memória normal, isso é, como uma variável, isso faz com que um driver possa ser completamente escrito em C/C++, caso seja feita a primeira abordagem, necessariamente o driver terá algum código em ASSEMBLY. A outra vantagem é que não é necessário qualquer mecanismo de proteção especial para impedir que os processos do usuário executem E/S, tudo o que o SO tem de fazer é deixar de mapear aquela porção do espaço de endereçamento associada aos registradores de controle no espaço de endereçamento virtual do usuário.

### Acesso Direto à Memória (DMA)

O Acesso Direto à Memória (DMA) é uma das técnicas utilizadas para otimizar o uso de memória por dispositivos. O DMA é um componente de hardware que permite a transferência direta de dados entre dispositivos periféricos e a memória principal, tornando assim dispensável a participação da CPU neste processo.
O controlador de DMA é um hardware desenvolvido para desempenhar toda a sequência de transferência de dados acessando diretamente a memória. Ele gerencia vários canais que podem ser programados para realizar a transferência de dados, quer seja de um dispositivo para a memória ou vice-versa.
O SO somente pode usar o DMA se o hardware tem o controlador de DMA. O DMA melhora o desempenho do sistema, pois poupa tempo ocioso da CPU, que poderia muito bem executar a tarefa do DMA, porém como o tempo de E/S é grande principalmente para grandes quantidades de dados pode fazer com que a CPU fique muito tempo ociosa. Quando a quantidade é pequena as vezes é até mais viável fazer a transferência direto pela CPU que é um hardware mais rápido que o DMA, isso pode causar concorrencia no barramento, pois o barramento utilizado pelo DMA para acessar a memória é o mesmo utilizado pela CPU. Utilizando o DMA, a CPU requisita ao DMA de onde começar a ler os bytes, quantos bytes devem ser lidos/escritos e fica livre para executar outras tarefas que sejam CPU Bound, então quando o DMA termina de realizar sua tarefa, ele transmite um sinal de interrupção para a CPU que simplesmente usa os bytes.
Note que a CPU pode fazer exatamente o que o DMA faz, isso fica a cargo de projeto. Coloca uma requisição de leitura no barramento e fica esperando até receber os bytes e assim poder usa-lo, a diferença é que usando a CPU para transferência de uma quantidade maior de dados, poderá ocasionar em CPU ociosa.
Um computador tem dois gerenciadores de DMA, divididos em canais. Os canais 0 a 3 são gerenciados por um gerenciador, enquanto os canais 4 a 7 vão para o outro.
Para visualizar quais canais estão em uso em sistemas Linux basta digitar no shell o comando:
$ cat /proc/dma
Os oito canais e seus usos são descritos a seguir: 0 = usado pelo refresh da memória Ram dinâmica. 1 = placas de som de 8 bits, adaptadores SCSI, placas de rede. 2 = controladora de disquete 3 = porta paralela ECP, placas de som de 8 bits, adaptadores SCSI, placas de rede, controladores de scanner antigos. 4 = ponte para a controladora de DMA 0~3 5 a 7 = placas de som, adaptadores SCSI, placas de rede.
Os canais 1 a 3 operam sob 8 ou 16 bits, enquanto os canais 5 a 7 operam apenas sob 16 bits.
Dispositivos PCI (e outros de alta velocidade) possuem um controlador de DMA embutido, muito mais rápido que o DMA simples. Por exemplo, esse controlador é usado em discos rígidos atuais e pode atingir velocidades de 66MB/s.

## Processo de Entrada e Saída (E/S)
### E/S programada

Neste método o processador executa o programa e tem o controle total sobre as operações de entrada e saída:
* I - Os dados são copiados para o núcleo;
* II - O Sistema Operacional envia, para a saída, um caractere de cada vez;
* III - A cada caractere enviado, a CPU verifica se o dispositivo está pronto para receber outro;
Esse comportamento é chamado de espera ociosa ou polling.
A desvantagem desse método é que como o processador geralmente é mais rápido que o dispositivo de E/S ocorrerá um desperdício de processamento.

### E/S orientada à interrupção

Diferentemente da E/S programada, em que a CPU fica verificando o dispositivo para saber se ele está pronto para mais operações ou se terminou, na E/S orientada à interrupção, a CPU passa a realizar outras tarefas escalonadas até que seja informada pelo dispositivo, por meio de uma interrupção, que este está pronto para mais caracteres ou concluiu sua tarefa. Quando isso acontecer, o processador para o que está fazendo para executar o tratador de interrupção, quando sua execução estiver terminada, o processador volta à rotina que foi interrompida inicialmente.
Para que seja empregada essa política de interrupções existem detalhes de software e de hardware que devem ser atendidos, e para que esses detalhes sejam executados, a maioria dos computadores possuem um hardware denominado controlador de interrupções. As principais funções do controlador de interrupções são:
* identificar a fonte da interrupção;
* priorizar uma interrupção em relação a outra;
* selecionar quais interrupções serão atendidas.
O emprego de interrupções libera o computador para realizar cálculos, então o processador fica responsável apenas por iniciar a operação de entrada-saída, e quando esta for concluída, executar o tratador de interrupção.

### E/S usando DMA

No método de E/S orientada à interrupção, a cada caractere processado, é gerado uma nova interrupção à CPU. Para diminuir o peso de processamento sobre a CPU, que perderia muito tempo por conta das contínuas interrupções, passa-se tal tarefa para o DMA, que passará a administrar as interrupções por buffer (não mais por caractere). O DMA executa então a E/S programada (neste caso, não é a CPU que faz o trabalho, mas sim o controlador do DMA).
Quando existe uma quantidade de dados significante para ser transferida a técnica de Interrupções se torna ineficaz, sendo melhor a utilização de um hardware especial (Controlador de DMA), que transfere os dados diretamente de um dispositivo de E/S para a memória, ou vice e versa.
A transferência por DMA acontece quando o processador inicializa o controlador DMA, fornecendo todas as informações necessárias sobre os dados a serem transferidos (quantidade de dados, origem e destino dos blocos e ainda o sentido da transferência), depois ele dispara a execução do DMA e enquanto a transferência estiver ocorrendo o processador pode se dedicar a outra tarefa. Ao final da transferência o DMA sinaliza ao processador por meio de uma interrupção de hardware.

## Drivers
### O que são drivers

Um driver é uma camada de software que faz a comunicação do sistema operacional com o controlador do hardware que por sua vez faz a interface com o hardware. Drivers escondem as diferenças entre os diversos dispositivos, através de uma interface de programação única.
Driver de dispositivo é responsável por implementar as rotinas necessárias ao acesso e à gerência de um dispositivo específico.
A camada de drivers de dispositivo representa uma parte significativa do sistema de entrada e saída em relação às funcionalidades. Ela é responsável por implementar as rotinas necessárias ao acesso e à gerencia de um dispositivo específico.É necessário que o software de E/S realiza a programação de registradores internos de controladores que compõem a interface física dos dispositivos e implementa os respectivos tratadores de interrupção. Assim, cada tipo de dispositivo requer um driver apropriado. Essa camada fornece uma abstração a mais genérica possível para a camada superior, a de E/S independente do dispositivo.
Cada dispositivo de E/S ligado ao computador precisa de algum código específico do dispositivo para controlá-lo. Esse código, chamado de driver do dispositivo.
Para acessar o hardware do dispositivo, o driver normalmente deve ser parte do núcleo do SO.
Os sistemas operacionais geralmente classificam os drivers dentre algumas poucas categorias. As categorias mais comuns são dispositivos de bloco - os quais contêm vários blocos de dados que podem ser endereçados independentemente - e os dispositivos de caractere, os quais geram ou aceitam uma sequencia de caracteres.
A maioria dos SOs define uma interface-padrão para todos os drivers de blocos e uma segunda interface-padrão para todos os drivers de caracteres. Essas interfaces consistem em um número de procedimentos que o restante do so pode utilizar para fazer o driver trabalhar para ele.
Um driver de dispositivo apresenta várias funções. A mais óbvia é aceitar e executar requisições abstratas, de leitura ou gravação, de um software independente de um dispositivo localizado na camada acima da camada de drivers dos dispositivos. Mas existem também algumas poucas outras funções que ele tem de executar.

### Drivers no Linux X Drivers no Windows

Enquanto no Windows, os drivers são desenvolvidos pelos próprios fabricantes do dispositivo, precisando ser instalados manualmente e seguindo de um processo de reboot do sistema. Em ambientes GNU/Linux, a instalação dos "drivers" são incorporados diretamente ao Kernel e vêm pré-instalados no sistema.

### Drivers Linux

Em sistemas GNU/Linux os "drivers" são chamados de módulos. O kernel desse sistema é dito monolítico com vantagens de micro-kernel já que os sistemas GNU/Linux são LKM(Loadable Kernel Modules), já que os "drivers" ou módulos são carregáveis ao sistema sem a necessidade de um novo processo de bootstrap após a instalação. Para maior facilidade com o usuário, esse carregamento é feito no processo de bootstrap. Na verdade na maioria dos sistemas operacionais que contam com o desenvolvimento da comunidade do software livre, os módulos são desenvolvidos pela comunidade de desenvolvimento. Se esse módulo tem uma boa aceitação pela própria comunidade e passou por todos os requisitos propostos pela equipe de desenvolvimento do kernel do sistema, esse pode passar a fazer parte do próprio kernel do sistema. Dessa forma, o usuário não precisa correr atrás da instalação uma vez que o driver está incorporado e instalado no sistema.

### Drivers Windows

Nem sempre a companhia que desenvolveu certo hardware, também tem que desenvolver o driver para o mesmo. Há casos em que o hardware foi desenvolvido sobre um certo padrão de hardware. Nesses casos, um driver genérico é desenvolvido pela Microsoft para esse dado padrão. Nem todos os drivers se comunicam diretamente com o dispositivo. Pode haver uma pilha de drivers para determinado dispositivo, em que parte deles age como um filtro, transformando os dados de um formato para o outro, enquanto apenas a base da pilha se comunica diretamente com o dispositivo. Isso pode ser melhor visualizado por uma imagem disponibilizada pela própria Microsoft em seu site:
http://i.msdn.microsoft.com/dynimg/IC535115.png
Também, nem sempre os drivers estarão associados a um dispositivo. Também existe os “Software Drivers”. Em determinados momentos, uma aplicação precisa de acessar recursos que ela só poderia acessar em modo kernel, porém ela está em modo usuário. Então, divide-se essa aplicação em dois componentes: a aplicação que rodará em modo usuário, que fará a interface com o usuário e um driver que rodará em modo kernel, dando acesso aos recursos necessários. Esse driver que roda em modo kernel é chamado de Software Driver. No site da Microsoft também está disponível uma imagem que ilustra isso:
http://i.msdn.microsoft.com/dynimg/IC535116.png
Em casos em que determinado hardware desenvolvido não segue um padrão pré-existente, que tenha driver desenvolvido pela Microsoft, a companhia também precisa desenvolver o driver. No site da Microsoft, existem explicações sobre como construir um driver para Windows, dicas de performance e outros. Podemos encontrar essas informações em: http://msdn.microsoft.com/en-us/windows/hardware/gg454507
Para desenvolver esses drivers, o desenvolvedor deve saber conceitos do funcionamento interno do Windows, como o gerenciamento de memória, fluxo de entrada e saída, entre outros. Para ajudar em seu desenvolvimento, a Microsoft disponibiliza o Windows Driver Kit (WDK), com uma série de utilitários para criar um driver, como bibliotecas, ambiente de desenvolvimento, exemplos, etc. Como parte do WDK, também é disponibilizado o Windows Driver Foundation (WDF). O WDF define um único modelo de driver que pode ser usado para criar drivers orientado a objetos, tanto para o modo kernel quanto para o modo usuário. Ele também inclui frameworks para drivers de modo kernel e modo usuário, além de uma série de utilitários de verificação para o driver.

### Formas de instalação

Em Windows, esses drivers são desenvolvidos pelos fabricantes do dispositivo. É criado um arquivo executável somente com o binário desse driver para a instalação e utilização. Geralmente é um arquivo *.exe. Esse processo faz com que o usuário fique totalmente alienado daquilo que está acontecendo com a sua máquina durante a instalação.
Em GNU/Linux, os módulos podem ser de vários tipos. O usuário pode baixar o código-fonte, compila-lo e instala-lo na sua máquina. Esse é um processo bastante dificultoso para quem não tem muito conhecimento técnico nesses sistemas. Também o usuário pode recorrer ao módulo pré-compilado do sistema. Esse é um processo bastante similar ao do Windows já que é um script executável pelo gerenciador de pacotes do sistema da máquina.

## Dispositivos de armazenamento

É um dispositivo capaz de gravar(armazenar) informação(dados). Essa gravação de dados pode ser feita virtualmente, usando qualquer forma de energia. Um dispositivo de armazenamento retém informação, processa informação, ou ambos. Um dispositivo que somente guarda informação é chamado de mídia de armazenamento. Dispositivos que processam informação podem tanto quanto acessar uma mídia de gravação podem tanto acessar uma mídia de gravação portátil, ou ter um componente que armazena dados.

### Tipos de dispositivos de armazenamento

os dispositivos de armazenamento se diferem quanto ao tipo de mídia, tipo de armazenamento( volátil e não-volátil), capacidade de armazenamento e velocidade de escrita.

### Armazenamento por meio magnético

Dentre os dispositivos de E/S, podemos considerar o disco magnético como sendo o mais importante, devido diversos papéis que ele desempenha junto ao Sistema Operacional. Dentre esses papéis estão:
* Armazenamento de dados;
* Armazenamento de dados com tolerância às falhas de segurança de dados (RAID);
* Utilização como memória virtual (auxiliando a memória RAM, quando esta não pode guardar todos as páginas de dados processos, etc);
Os discos magnéticos podem ser confeccionados em diferentes materiais (plástico, metal, etc), recobertos por uma parte em material magnético. Essa parte magnética será responsável pelo armazenamento de dados. Esse armazenamento de dados, dá-se pela escrita por parte de um dispositivo de Hardware (cabeçote de leitura e gravação), o mesmo incidirá um campo magnético que definirá de maneira binária a informação. A união dessas áreas definidas pelo cabeçote formará uma informação (dados).
Da mesma maneira que dados podem ser escritos no disco magnético, eles podem ser recuperados (pelo mesmo dispositivo de Hardware) que localizaria os dados, então faria a leitura magnética do que foi anteriormente gravado.
Indo mais a fundo sobre as regiões magnéticas do disco, tem-se que ele é dividido em trilhas circulares concêntricas, separadas por "gaps" (que evita problemas de alinhamento entre as trilhas). Existem duas arquiteturas diferentes para essas trilhas:
* CAV - número constante de bits a cada trilha. ---
* CLV - número de bits por trilha, dependedente da posição da trilha (mais interna ou mais externa).
CAV: Constant Angular Velocity. CLV: Constant Linear Velocity.
Um aumento de temperatura é concorrente ao bom armazenamento de dados, pois ocorre a desorientação dos "spins" (binários). Esses efeitos devem ser prevenidos pelos desenvolvedores do disco.
Como dito anteriormente, existem diversos tipos de dispositivos de E/S, bem como diversos tipos de discos magnéticos. São muitas as tecnologias, envolvendo diferentes maneiras de leitura e escrita no mesmo, diferentes maneiras de se agrupar camadas de disco, diferentes maneiras de trabalhar a velocidade do giro disco, etc.

### Armazenamento por meio óptico

Os tipos de armazenamento por meio óptico sâo comumente empregados para o armazenamento de informações multimídia, como por exemplo som e vídeo.
O funcionamento desses dispositivos se dá por meio de um feixe de laser de alta precisão, que é projetado na superfície da mídia, está por sua vez, possui sulcos microscópicos capazes de desviar o laser em diferentes direções, representando assim as informações armazenadas na forma de bits.
Exemplos de dispositivos de armazenamento ópticos são: CD-ROMs, CD-RWs, DVD-ROMs, DVD-RWs, etc.

### Armazenamento por meio eletrônico

São dispositivos de memórias de estado sólido ou SSDs. Possuem memória não volátil e funcionam por meios de circuitos eletrônicos.
Encontramos dispositivos de armazenamento eletrônico em pen drives, cartões de memória e até mesmo em discos rígidos, onde são usados como buffer.
As gravações de dados em dispositivos de armazenamento eletrônico se da pelo carregamento de elétrons na camada de óxido existente entre duas portas feitas de materiais semicondutores, essas duas portas representam um dígito binário (bit). Assim, a presença de elétron entre essas duas portas indica que o ativamento do bit, ou seja, valor 1, caso não haja a presença de elétrons representa o bit inativo ou valor 0.

## Outros dispositivos
### RAID

A tecnologia RAID é utilizada para controlar o uso de várias unidades físicas (HDs) em um único servidor na tentativa de suprir duas de suas necessidades básicas, que são a confiabilidade e o desempenho. A partir deste ponto, alguns métodos (paridade, mirroring, stripping) são utilizados isolados ou combinados para compor diferentes estruturas lógicas (RAIDs 0, 1, 2, 3, 4, 5, 6, 10) que podem ser controladas por software ou por hardware. Vale a pena destacar que o primeiro caso, de controle por software, apresenta pior desempenho, uma vez que os métodos são realizados diretamente pelo Sistema Operacional, enquanto que no segundo caso, controlado por hardware, o método utilizado é transparente para o SO e ocupa apenas o hardware, que necessita ser capaz de suportar tal técnica.
OS NÍVEIS DE RAID
RAID NÍVEL 0 - Também chamado de "Striping" ou "Fracionamento" este nível é usado quando se deseja melhorar a performance do computador, nele os dados são divididos em segmentos, que tem um tamanho específico de bloco, e divididos entre os discos proporcionando grande velocidade na gravação e leitura de informações pois os dados são gravados ao mesmo tempo nos discos. Logo quanto maior o número de discos, mais rápido é a distribuição dos dados. Esse nível não aceita falhas uma vez que não existe redundância ao gravar os dados, logo se um hd der problema pode ocasionar perda de informações.
RAID NÍVEL 1 - Também chamado de "Mirroring" ou "Espelhamento" este nível é usado quando se deseja garantir a integridade dos dados, nele os dados são clonados para outro dispositivo, ou seja, se um computador com dois disco rígidos utilizam este nível, ao gravar dados em um disco automaticamente será gravado no outro tornando-os cópias idênticas, a gravação se torna mais lenta uma vez que precisa ser gravado duas vezes, entretanto a leitura é mais rápida pois existem duas fontes de dados idênticas. Se houver falha em um disco ou perda de dados basta recuperar o setor defeituoso copiando os arquivos contidos do outro disco, esse nível é muito usado em servidores de arquivos.
RAID NÍVEL 2 - Este nível é responsável por monitorar os discos quanto a falhas garantindo uma maior consistência nos dados caso ocorra falta de energia durante a escrita. Essa funcionalidade perdeu utilidade a partir do momento em que os fabricantes de disco rígidos passaram a implementar mecanismos internos para detectar falhas e garantir a integridade dos dados.
RAID NÍVEL 3 - Para utilizar esse nível pelo menos 3 discos são necessários, nesse nível os dados são divididos entre dois discos e o terceiro fica responsável pelas informações de paridade, assim todos os bytes tem sua paridade exceto 1 que identifica o erro, através dessas informações é possível identificar onde o erro ocorreu garantindo a integridade dos dados em caso de recuperação, a sua montagem é via software e exige que todos os eixos das unidades de discos estejam sincronizados.
RAID NÍVEL 4 - Utiliza a mesma técnica do nível 3, porém em caso de falhas os dados são reconstruídos em tempo real através da utilização da paridade calculada a partir dos outros discos, sendo que cada um pode ser acessado de forma independente. Se algum dos discos estragar a paridade é usada imediatamente para reconstruir o conteúdo e os outros discos, que armazenam dados, são configurados para utilizarem segmentos grandes permitindo leituras independentes da informação armazenada.
RAID NÍVEL 5 - Oferece mais desempenho em relação ao nível 4 pois agora a paridade encontra-se distribuída nos discos, fazendo com que a gravação seja mais rápida pois não é necessário acessar um único disco a cada gravação, esse é o nível mais utilizado.
RAID NÍVEL 6 - Semelhante ao nível 5 porém usa o dobro de bits de paridade garantindo a integridade de até dois disco rígidos falharem ao mesmo tempo, o RAID 6 pode ser utilizado para sistemas de missão-critica aonde a confiabilidade dos dados é essencial.
RAID NÍVEL 0+1 - É o nível mais caro de ser implementado pois exige no mínimo 4 discos rígidos, esse nível implementa rapidez e integridade dos dados pois ele combina os níveis 0 e 1 onde os dados são divididos entre os discos para melhorar o rendimento, mas também utilizam outros discos para duplicar as informações.