Trabalho Prático Nº2 Escrita e Leitura em Portos IO 1. OBJECTIVOS - Saber efectuar a escrita e leitura em portos de entrada saída num PC num com operativo DOS e Windows. 2. INTRODUÇÃO Para este trabalho de escrita e leitura em porto num PC, vamos utilizar o Altifalante do PC para gerar sons o que implica que se efectuem leituras e escrita em portos de IO. É pois necessário entender o funcionamento do temporizador num PC, que é uma emulação do dispositivo 8254 e de como é efectuado o controlo do próprio altifalante. No PC o relógio dos três contadores/temporizadores é o mesmo: uma onda quadrada de 1,19318 MHz, pelo que cada contagem tem uma duração de 838,1ns. O canal 0 é o temporizador do sistema, a GATE está ligada a V cc pelo que este contador está sempre activo. O seu relógio é uma onda quadrada de 1,19318MHz. A saída do canal 0 provoca a IRQ0, que corresponde à interrupção 08h (INT 08h) do DOS e à interrupção 50H nos sistemas de 32bits, que corresponde a uma interrupção mascarável de mais alta prioridade, este canal é programado pela bios do PC para gerar na sua saída uma onda quadrada com a frequência de 18,206Hz que activa a IRQ0, resultando num pedido de interrupção a cada 54,936ms. O canal 1 inicialmente foi o responsável pelo indicar dos instantes em que deveria ser efectuado o refrescamento da memória dinâmica, a saída deste canal é usada para gerar pedidos ao canal 0 do DMA (DRQ0). Nos PC s dos nossos dias esse refrescamento já não é efectuado pelo canal 0 do DMA, mas sim por um circuito dedicado. O canal 2 é usado para gerar para activar o altifalante do sistema. A saída do canal 2 corresponde à entrada do altifalante. A entrada de relógio deste canal Microprocessadores III ano lectivo 2004/2005 Página 1 Trabalho Prático Nº2
corresponde a uma onda quadrada de 1,193818 MHz, o controlo é efectuado pelo registo da porta 61H, em que os bits 0 e 1 têm as seguintes funções: Bit Funções 61H.0 Speaker Data Enable 0: Não habilitado 1: Habilitado 61H.1 Timer Counter 2 Enable 0: Altifalante a 0 1: Altifalante é equivalente ao valor OUT do contador 2 CANAL 2 1,193MHz 838,6 ns 61H.0 1/N altifalante 61H.1 & Figura 3.1: Temporização do canal 2, usado para gerar sons. Passos para gerar sons no altifalante do PC: 1. Escrever 182 no porto 43H. 2. Escrever a frequência no porto 42H, como o valor a escrever é de 16 bits e o porto é de 8 bits é necessário escrever 2 vezes 8 bits no endereço 42H, o byte menos significativo é enviado em primeiro lugar. 3. Para activar altifalante os bits 0 e 1 do porto 61H deve ser colocados a nível alto, os restantes bits dos registos 61H devem ser mantidos inalterados pois desempenham outras funções no PC 4. Efectuar uma pausa que corresponderá À duração do tom 5. Desligar o altifalante colocando os bits 0 e 1 do porto 61H a nível baixo. Microprocessadores III ano lectivo 2004/2005 Página 2 Trabalho Prático Nº2
Modo Protegido de acesso aos portos IO no sistema operativo Windows de 32 bits No tempo em que o DOS era o sistema operativo de computadores com procesadores Intel 8088 ou em modo real nos CPU que lhe sucederam o acesso aos porto de entrada saída eram directos e o DOS não efectuava a gesto do mesmo. Para o acesso a portos no espaço de endereçamento IO, podem ser usadas as instruções in e out. A linguagem C oferece instruções de alto nível para estas instruções. Por exemplo, uma escrita de 00h no porto I/O 300h é no Turbo C, efectuada do seguinte modo: outportb(0x300, 0x00) a que equivale: mov al,0 mov dx,300h out dx,al Com o processador 80286 surgiu o funcionamento em modo protegido e posteriormente aperfeiçoado com o 80386. O funcionamento em modo protegido possibilitou o desenvolvimento de varias plataformas como sejam os sistemas operativos multitarefa Windows e Linux. O funcionamento em modo protegido especifica: - Processamento lógico e aritmético a 32 bits - Recursos para segmentação - Recursos para paginação e memória virtual - Conjunto de instruções ampliado - Arquitectura Multitarefa - Permite a execução de software escrito para modo real (modo virtual 8086) Um PC com um processador 80386 ou superior em funcionamento em modo protegido é fundamentalmente um computador para multitarefa, porque é dotado de uma arquitectura multitarefa que permite a execução de vários programas concorrentes, (funcionamento em simultâneo) que partilham recursos de hardware ou de software. Cada programa (processo) em execução é visto pelo processador como uma ou mais tarefas. Instruções especificas e um pipeline adequado permite a comutação entre as execuções das tarefas sejam feitos de forma eficiente e transparente para os programas. As tarefas operam de forma independente umas das outras o funcionamento de uma tarefa não deverá influenciar na operação de outra. Microprocessadores III ano lectivo 2004/2005 Página 3 Trabalho Prático Nº2
O modo protegido define um ambiente para o controle e execução das tarefas, constituído por registos e estruturas de dados e tabelas, mapeadas em memória. Existem várias tabelas de descritores geridas pelo sistema operativo que permitem efectuar o controle e gestão das tarefas que estão em execução concorrente. Com o sistema operativo Windows os programas são executados em vários níveis de privilégio As porta I/O apenas são acessíveis quando o nível de privilégio da tarefa em execução (CPL - Current Previlege Level) for numericamente menor ou igual ao seu nível de privilégio de IO (IOPL - Input Output Privilege Level), ou seja CPL <= IOPL. Sendo o privilégio 0 (zero) o maior enquanto o privilégio 3 o menor, estes níveis de privilégios são conforme os anéis de funcionamento do software definidos como anéis (rings) em que o Kernel do sistema operativo é executado no nível 0 e os aplicativos são executados no nível 3, fazendo com que deste modo uma aplicação normalmente não possa ter acesso à leitura/escrita em modo protegido. Os drivers de dispositivos, que correspondem, a um conjunto de serviços disponibilizados pelo sistema operativo para tornar eficiente a comunicação entre o dispositivo de hardware e o CPU. Um driver pode ser um módulo que está ligado dinâmicamente à aplicação através de uma.dll ou pode ser integrado na aplicação. Também existe o conceito de dispositivo virtual, ou seja um dispositivo como se hardware se tratasse através de drives VxD que interceptam todo acesso que se tenta fazer ao hardware. Aplicação tenta aceder ao I/O Aplicação comunica com um device-driver A aplicação solicita serviços ao device-driver que tem privilégio para aceder ao porto I/O device-driver realiza o acesso ao porto I/O e efectua a transferência de/para a aplicação Figura 3.2: Exemplo de quando uma aplicação usa um device-driver para aceder a portos IO Microprocessadores III ano lectivo 2004/2005 Página 4 Trabalho Prático Nº2
Aplicação tenta aceder ao I/O O processador gera internamente uma falha geral de excepção Caso existe um atendimento da excepção com privilégio suficiente o Aplicativo pode aceder ao porto IO Figura 3.3: Exemplo de quando uma aplicação sem privilégios tenta aceder a portos IO LIVRARIA DINÂMICA INPOUT32.DLL As livrarias podem ser ligadas ao código executável de uma forma estática e de uma forma dinâmica. A estática é utilizada para combinar as rotinas das livrarias com o código executável, quando o código do programa é criado o linker adiciona ao programa do código executável o código objecto correspondente às funções, este é o método mais comum para efectuar a ligação das livrarias, este método é de fácil implantação e eficiente, no entanto origina maior tamanho do código executável. Na utilização de ligação dinâmica.dll, ao contrário da estática, não é copiado nenhum código da livraria para o programa executável. O código executável fica com o nome da DLL necessária na qual a função necessária reside. Quando o programa é executado a DLL correspondente é carregada e são chamadas as funções necessárias. Este método limita o tamanho do código do programa mas tem um compromisso com a eficiência do mesmo. Com a livraria dinâmica Inpout32.dll é possível o acesso em leitura e escrita em todas as versões de windows sem que seja necessário efectuar qualquer modificação. A DLL identifica a versão do sistema operativo sempre as que as funções de escrita ou leitura em portos são chamadas, se for o Windows 9x a dll usa as funções _inp() e _outp(), se o sistema operativo for o Windows NT, 2000 ou XP, é instalado um drive para operar ao nível anel zero do Kernel e a aplicação escreve e lê no porto por meio do driver, pelo que o programa do utilizador é indiferente à versão do sistema Microprocessadores III ano lectivo 2004/2005 Página 5 Trabalho Prático Nº2
operativo. Para a utilização das funções da livraria o ficheiro inpout32.dll deve ser colocado na directoria Windows/system32 e Hwinterface.sys em Windows/system32/sys Figura 3.4: Fluxograma do funcionamento da livraria dinâmica Inpout32.dll 3. TRABALHO 1 Abra o projecto GeradorDeSons 2 Na Solutions Explorer, faça duplo-click em Form1.cs para visualizar os detalhes da forma Gerador De Sons no Design View 3 Examine a classe PortInterop.cs using System; using System.Runtime.InteropServices; public class PortAccess { [DllImport("inpout32.dll", EntryPoint="Out32")] public static extern void Output(int adress, int value); /* For receiving from the ports */ [DllImport("inpout32.dll", EntryPoint="Inp32")] public static extern int Input(int adress); } Microprocessadores III ano lectivo 2004/2005 Página 6 Trabalho Prático Nº2
4 Em.Net é através do atributo Dllimport que se efectua o carregamento de um livraria dinâmica permitindo dessa forma utilizar as suas funções. De acordo com a definição da classe PortAccess temos os métodos para ler e escrever, respectivamente: Int PortAcess.Input (int address) void PortAcess.Input (int address,int valor) 5 No Design View faça duplo click em Form1 insira a chamada do método: PortAccess.Output(0x43,182); Sempre que for efectuado o carregamento da form1 escreve 182 no porto 0x43, na prática equivale a sempre que o programa for executado 6 No Design View faça duplo click no botão Start que pretende ser o início de som e insira a chamada do método: PortAccess.Output(0x61,(PortAccess.Input(0x61) 0x03)); 7 No Design View faça duplo click no botão Stop que pretende ser o fim de som e insira a chamada do método: PortAccess.Output(0x61,(PortAccess.Input(0x61)&0xFC)); 8 No Design View faça duplo click em no botão Escreve no Porto 42H que pretender ser a frequência do som // escreve 8 bits menos significativos PortAccess.Output(0x42,Convert.ToUInt16(txtWrite.Text)); // escreve 8 bits mais significativos PortAccess.Output(0x42,(Convert.ToUInt16(txtWrite.Text)>>8)); 9 Execute o programa e teste o seu funcionamento Microprocessadores III ano lectivo 2004/2005 Página 7 Trabalho Prático Nº2