Drivers de Dispositivos
Autor: Hermano | Publicado: 2013-11-21T08:12:00-08:00


&nbsp;<!--[endif]-->Driver do Console



O driver do console é
o nome dado ao servidor responsável pelo controle do teclado e do vídeo do computador.
Embora sejam dispositivos diferentes, eles foram integrados em um só servidor,
pois existe uma interação constante entre eles. Isto é, aquilo que é digitado
pelo usuário com o uso do teclado muitas vezes é imediatamente escrito no
vídeo.



De maneira geral, o driver
do console suporta diversos clientes ao mesmo tempo. Os clientes são threads que fazem solicitações ao driver. As solicitações são usualmente para
a escrita de dados no vídeo ou para a leitura de dados do teclado. Entretanto,
existem solicitações para alterar a cor do texto, ou a mesmo a posição do
cursor na tela.



Para cada cliente diferente, o servidor cria um conjunto de
variáveis para armazenar o estado da tela, e estas variáveis compõem o console
virtual. Cada cliente tem seu próprio console virtual, com cada caractere na
tela salvo em um arquivo, e com as configurações de cor, posição do cursor, e algumas outras armazenadas em
uma estrutura. No momento em que um cliente fica em primeiro plano (foreground), os dados contidos em seus
arquivos são carregados na memória de vídeo, e tudo é configurado de acordo com
os dados salvos em sua estrutura. O usuário pode alternar entre diferentes
consoles, apertando uma combinação de teclas, e então se comunicar com diversos
clientes. 



As operações de escrita no vídeo são realizadas diretamente na
memória de vídeo apenas quando o cliente que as solicitou está em primeiro
plano. Quando este está em segundo plano, os dados são gravados em um arquivo
contendo o estado do vídeo. Além disso, a entrada dos dados do teclado só é
redirecionada ao cliente que está em primeiro plano.



Quando um novo thread se comunica com o servidor, este
verifica se já existe algum thread do
mesmo processo que tenha feito alguma solicitação. Caso não exista, um novo
console virtual é criado e a operação solicitada é realizada. Caso haja, o
servidor executa a operação solicitada no console virtual já existente. 



Driver do Vídeo



O driver do vídeo
desenvolvido inicialmente para o sistema FESO suporta apenas placas de vídeo
VGA no modo 0, no qual apenas texto é suportado. No modo 0, a tela do monitor
de vídeo é dividida em 80 colunas por 25 linhas, como se fosse um grande
reticulado [1]. &nbsp;



Para escrever dados na tela, uma região especial da memória (a
memória de vídeo) é utilizada. A memória de vídeo no modo 0 começa na posição B800h,
de maneira que o caractere no canto superior direito é representado pelos
primeiros 2 bytes a partir dessa
posição de memória [2]. Cada uma das 2000 posições (80 x 25) pode
ser acessada por endereço correspondente a partir da posição de memória B800h.




Os caracteres são codificados por 2 bytes. O byte menos
significativo armazena o código ASCII do caractere que deve ser impresso, e o byte mais significativo ainda se divide,
de maneira que seus 4 bits menos
significativos codificam a cor do caractere, e seus 4 bits mais significativos codificam a cor de fundo. Embora os
caracteres fiquem dispostos visualmente como colunas e linhas, eles estão
armazenados em uma região linear de memória. O driver trata esta região da memória como um vetor de palavras de 2
bytes. O índice no vetor para escrever um caractere na linha i e na coluna j é
dado por: i*80 + j. 


Driver do Teclado



O teclado é um dispositivo que permite que os usuários façam a
entrada de dados para os programas. Sempre que uma tecla é pressionada ou
liberada, a IRQ de índice 1 é gerada. O driver
do teclado aloca a porta referente a essa IRQ durante o processo de
inicialização do sistema operacional, desta maneira, sempre que uma tecla é
pressionada, o driver do teclado muda
seu estado de espera para pronto, e executa uma rotina para ler a tecla.



O driver do teclado
acessa uma determinada porta de E/S para ler do buffer do teclado qual tecla foi pressionada pelo usuário. O valor
lido pelo driver é conhecido como scancode ou código de varredura. A
relação entre o scancode e a tecla
depende do layout do teclado em si, e
varia de acordo com o idioma do dispositivo. O driver do sistema FESO implementa um vetor que faz um mapeamento
entre os scancodes e as teclas para
um teclado brasileiro, permitindo a conversão dos valores lidos em caracteres. Existem dois modos nos quais os drivers de teclado funcionam para
atender as necessidades dos programas. São eles: o modo bruto (raw mode) e o modo preparado (cooked mode), também conhecido como modo
canônico.





No modo bruto, o caractere representado por cada tecla é
repassado diretamente ao programa, sem nenhuma interferência do driver. Este é o modo ideal para
programas que precisam de uma maior liberdade para lidar com as teclas
pressionadas pelo usuário. É o caso de um editor de texto que se encarrega de
tomar uma determinada ação para cada tecla diferente que é pressionada pelo
usuário.



Porém, há programas que não tem necessidade de tanta liberdade,
para os quais uma entrada corrigida dos dados é mais conveniente. Por exemplo,
um interpretador de comandos que aguarda a entrada de um comando do usuário. Supondo
que o usuário irá digitar o comando LISTAR. Porém, um erro ocorre, e ele digita
um R a mais no final da palavra. A tecla backspace
é pressionada, para que o último caractere digitado seja removido. Neste
exemplo a sequência de teclas digitadas pelo usuário foi L-I-S-T-A-R-R-backspace.



Tudo que o programa precisa saber é que o resultado final obtido
pelo pressionamento das teclas foi a cadeia de caracteres LISTAR. O programa
não precisa da entrada completa, apenas do resultado corrigido. Neste caso, o
modo preparado é o mais indicado, pois livra o programa da responsabilidade de
ajustar a entrada, deixando-a a cargo do driver.



Outra característica necessária do driver é o ecoamento de caracteres. O caractere correspondente a
cada tecla pressionada deve ser escrito (ecoado) na tela, de modo a permitir
que o usuário visualize o resultado do pressionamento da tecla de forma
imediata. O ecoamento, utilizado principalmente com o modo preparado,
simplifica em muito a relação dos programas com o driver, fazendo com que apenas as cadeias corrigidas sejam
enviadas as programas, quando o usuário termina de fazer sua entrada de dados
pressionando a tecla ENTER. 



Driver do Temporizador



O controle do tempo é fundamental para o sistema operacional, e muitas
vezes para os próprios aplicativos de usuário. Sistemas operacionais precisam
controlar a quantidade de tempo que um processo está em execução. Programas de
usuário podem precisar esperar um determinado período de tempo para continuar
sua execução, ou mesmo executar um trecho de código em um momento especifico.



Por causa desta necessidade, os projetistas dos PCs
implementaram o PIT, programmable interval
timer. O PIT é um chip que gera
uma interrupção em intervalos de tempo programáveis com base em um oscilador de
cristal independente da CPU [2]. Isto quer dizer que as
frequências de funcionamento do PIT independem da CPU presente no computador

.

O driver do
temporizador do sistema FESO tem algumas funções importantes. A primeira delas
é a configuração do PIT, fazendo com que este gere uma interrupção (IRQ 0)
aproximadamente a cada 50 ms. Essa interrupção faz com que a CPU interrompa o
programa em execução, coloque o driver
do temporizador em execução, e quando este entra em espera, um novo thread é escalonado na CPU.



Além de auxiliar no compartilhamento da CPU, este driver também pode receber solicitações
de threads que desejam ficar em
espera por um determinado período de tempo. Supondo que um thread queira ficar aguardando durante 1000 ms, basta enviar uma
mensagem ao servidor, e este irá criar um novo contador para o thread. O thread fica em estado de espera, aguardando por uma resposta do
servidor. Enquanto isso, o servidor atualiza o contador a cada nova
interrupção, e quando o contador chega ao limite, uma mensagem é enviada para o
thread cliente, a fim de acordá-lo.



Outra função importante deste driver é o controle da hora do sistema. No momento de sua
inicialização, além da configuração do PIT, o driver do temporizador também obtém a hora atual do sistema se
comunicando com a BIOS do computador. Uma vez que a hora é obtida, o próprio driver se encarrega de manter um
contador de horas, minutos, segundos e milissegundos. Assim sendo, os programas
de usuário podem obter a hora do sistema fazendo uma simples solicitação do driver do temporizador.



&nbsp;<!--[endif]-->Driver IDE


O sistema operacional FESO possui um suporte básico a
dispositivos IDE. Este suporte foi desenvolvido para permitir a utilização de
sistemas de arquivos externos ao kernel,
que necessitam de acesso a algum dispositivo de armazenamento. O driver desenvolvido para o sistema FESO
suporta a execução de operações simples nas interfaces ATA e ATAPI, e permite a
comunicação com drivers de discos
rígidos e de CD-ROM que funcionem neste formato.





O driver desenvolvido
utiliza entrada e saída programada. Neste modo de E/S, o processador precisa
executar uma sequência explicita de instruções para cada caractere lido ou
escrito (TANENBAUM, 2006, p. 225). O problema com essa abordagem, é que todos
os dados lidos passam obrigatoriamente pela CPU, &nbsp;fazendo
com que ela fique ocupada. 



As operações de leitura e escrita em discos rígidos e em outros
dispositivos podem ser consideradas lentas em comparação com a velocidade na
qual as CPUs podem executar instruções. Por este motivo, em alguns momentos a
CPU simplesmente fica em espera ocupada, até que uma operação seja concluída.
Este problema não ocorre com o uso de outras técnicas para a realização de
entrada e saída, como o acesso direto a memória, no qual os dados não precisam
passar pela CPU.






De qualquer forma, o driver
para dispositivos IDE foi desenvolvido utilizando entrada e saída programada,
pois esta é uma forma de comunicação simples, e suportada pela grande maioria
dos dispositivos. Entretanto, futuramente, melhorias no driver atual poderão permitir formas mais rápidas de E/S com esses
dispositivos.



Durante o processo de inicialização do driver, ocorre a detecção de dispositivos ATA e ATAPI conectados ao
computador. Os primeiros dispositivos ATA e ATAPI encontrados tornam-se
imediatamente os dispositivos padrão. Todas as solicitações de leitura e
escrita enviadas ao driver são repassadas
automaticamente aos dispositivos detectados.



O driver oferece aos
clientes algumas funções básicas. Ele permite a leitura e escrita de dados em
um determinado bloco de um dispositivo ATA, usualmente, um disco rígido. Também
permite a leitura de blocos em dispositivos ATAPI, por exemplo, um drive de CDROM. Essas funções são
utilizadas pelos servidores dos sistemas de arquivos, que precisam acessar
diretamente os dispositivos, e obter a estrutura do sistema de arquivo contido
nele.



[1]&nbsp;TORRES, Gabriel. Hardware: Curso Completo. 4. ed. Rio de Janeiro: Ed. Axcel Books, 2001.

[2]&nbsp;MESSMER, Hans-Peter. The Indispensable PC Hardware Book. 3. ed. Addison-Wesley Professional, 1999.