next up previous contents
Next: Memória Interna Up: Arquitectura e Organização Interna Previous: Evolução dos Computadores e


Barramentos de Sistema

Ao nível superior, um computador compreende o processador, a memória e os componentes de E/S, com um ou mais módulos de cada tipo. Estes componentes são interligados de alguma forma para realizar a função básica de um computador que é a execução de programas. Assim, ao nível superior, podemos descrever um computador (1) descrevendo o comportamento externo de cada componente, isto é, os sinais de controlo e os dados que este troca com os outros componentes e (2) descrevendo a estrutura de interconexão e de controlo requerida para manipular a estrutura de interconexão.

Esta vista de nível superior da estrutura e função é importante por causa do seu poder explicativo na compreensão da natureza do computador. Igualmente importante é o seu uso para a compreensão da crescente complexidade dos tópicos da avaliação de rendimento. Uma compreensão ao nível superior da estrutura e da função dá-nos discernimento sobre os gargalos do sistema, os caminhos alternativos, a dimensão das deficiências do sistema quando um componente falha e da facilidade de melhorar o rendimento. Em muitos casos, os requisitos de maior potência do sistema e capacidades de superação das falhas são alcançadas através de mudanças no desenho em vez de aumentar, meramente, a velocidade e a confiança dos componentes individuais.

Este capítulo põe a ênfase nas estruturas básicas usados para a interconexão dos componentes do computador. Como conhecimento de base, o capítulo começa com uma breve apreciação dos componentes básicos e dos requisitos de interface. Segue-se a apresentação de uma visão funcional geral.

Estaremos então preparados para examinar o uso dos barramentos para a interligar os componentes do sistema.

Componentes do computador

Tal como foi discutido no capítulo 2, virtualmente, todos os projectos de computadores contemporâneos são baseados nos conceitos desenvolvidos por John von Neumann, no Instituto para estudos Avançados, Princepton. Tal projecto é referido como a arquitectura de von Neumann e é baseada em três conceitos: O raciocínio por detrás destes conceitos foi discutido no Capítulo 1 mas vale a pena fazer um resumo aqui. Há um pequeno conjunto de componentes lógicos que pode ser combinado de várias maneiras para armazenar dados binários e para efectuar operações lógicas e aritméticas sobre esses dados. Se existir um cálculo particular a ser realizado, pode ser construída uma configuração de componentes lógicos especialmente desenhada para aquele cálculo. Podemos pensar no processo de ligar em conjunto os vários componentes na configuração pretendida, como uma forma de programação. O ``programa'' resultante fica na forma de hardware e é designado por programa em hardware.

Se toda a programação fosse realizada dessa forma, muito pouco uso poderia ser feito desse tipo de hardware. Mas consideremos, agora, a seguinte alternativa. Suponhamos que construíamos uma configuração de funções aritméticas e lógicas de uso-geral. Este tipo de hardware efectuaria várias funções sobre os dados dependendo dos sinais de controlo aplicados ao hardware. No caso original de personalização do hardware, o sistema aceita dados e produz resultados. (Figura 3.1a).

Figura 3.1: Abordagens por software e hardware.
\begin{figure}
\end{figure}

Com hardware de uso-geral, o sistema aceita dados e sinais de controlo e produz resultados. Isto é, em vez de refazer o hardware para cada novo programa, o programador apenas necessita de fornecer um novo conjunto de sinais de controlo.

Como é que se procede para fornecer os sinais de controlo? A resposta é simples mas subtil. O programa na sua totalidade é com efeito uma sequência de passos. Em cada passo, é efectuada alguma operação aritmética ou lógica sobre alguns dados. Se com efeito, fornecermos um código único para cada possível jogo de sinais de controlo e se adicionarmos ao hardware de uso-geral um segmento que possa aceitar um código e gerar sinais de controlo (Figura 3.1b).

Agora, programar é muito mais fácil. Em vez de refazer o hardware para cada novo programa, tudo o que necessitamos de fazer é fornecer uma sequência de códigos. Com efeito, cada código é uma instrução e uma parte do hardware interpreta cada instrução e gera sinais de controlo. Para distinguir este novo método de programação, uma sequência de códigos ou instruções é designada por software.

A figura 3.1b mostra dois componentes principais do sistema: um interpretador de instruções e um módulo de funções aritméticas e lógicas de uso-geral. Estes dois constituem o processador. Vários outros componentes são necessários para produzir um computador funcional. Dados e instruções têm de ser introduzidos no sistema. Para isso, necessitamos de um qualquer tipo de módulo de entrada. Este módulo contém componentes básicos para aceitar dados e instruções em determinados formatos e convertê-los num formato interno de sinais utilizável pelo sistema. Uma forma conveniente de reportar resultados é necessária e esta assume a forma de um módulo de saída. Vistos em conjunto, estes são designado por componentes de E/S.

É necessário ainda um outro componente. Um dispositivo de entrada transporta instruções e dados em sequência. Mas, um programa não é invariavelmente executado sequencialmente; pode saltar à volta (e.g. a instrução de derivação do IAS). Da mesma forma, as operações sobre os dados podem necessitar de mais do que um elemento em cada momento numa sequência pré-determinada. Assim, tem de existir um local para armazenar temporariamente tanto instruções como dados. Aquele módulo é designado por memória ou memória principal para poder distingui-la do armazenamento externo ou dispositivos externos. Von Neumann realçou que a mesma memória pode ser usada para armazenar tanto dados como instruções. Os dados deveriam ser vistos como informação sobre a qual os cálculos são efectuados. As instruções deveriam ser tratadas como dados para serem interpretados como códigos para gerar sinais de controlo.

A figura 3.2 ilustra estes componentes de nível superior e sugere a interacção entre si. O processador está tipicamente em posição de controlo. Troca dados com a memória. Para esse efeito, faz tipicamente uso de dois registos internos (à unidade de CPU): um registo de endereçamento de memória (MAR), que especifica o endereço na memória para a próxima operação de leitura ou escrita e um registo tampão de memória (MBR) que contém a informação a escrever na memória ou recebe a informação a ser lida da memória. De forma semelhante, um registo de endereçamento de E/S (E/S AR) especifica um dispositivo particular de E/S. Um registo tampão de E/S é usado para trocar informação entre um módulo de E/S e o processador.

Um módulo de memória consiste num conjunto de localizações, definidas por uma sequência de endereços sequenciais. Cada localização contém um número binário que pode ser interpretado como uma instrução ou dado. Um módulo de E/S transfere informação dos dispositivos externos para o processador e a memória e vice-versa. Esta contém tampões internos para manter a informação até que esta possa ser enviada.

Tendo observado brevemente os componentes principais, passamos agora para uma vista geral da forma como estes componentes trabalham em conjunto para executar programas.

Figura 3.2: Componentes do computador: vista de nível superior.
\begin{figure}
\end{figure}

Funções do computador

A função básica efectuada por um computador é a execução de programas. O programa a ser executado consiste num conjunto de instruções armazenado na memória. A unidade de processamento (CPU) faz o trabalho efectivo executando as instruções especificadas pelo programa.

Para obter uma maior compreensão desta função e da forma como os componentes principais do computador interactuam para executar um programa, necessitamos de olhar com mais detalhe o processo de execução de programas. O ponto de vista mais simples é considerar o processamento de instruções como sendo constituído por dois passos: O processador lê (extrai) as instruções da memória uma de cada vez e executa cada instrução. A execução do programa consiste na repetição do processo de extracção e execução de instruções. Claro que a execução de uma instrução pode, pelo seu lado, envolver um certo número de passos ( ver por exemplo, a porção inferior da figura 2.4). Neste estágio, podemos justificar a divisão do processamento de instruções em dois estágios de busca e de execução da seguinte forma: A busca de instrução é uma operação comum para cada instrução e consiste na leitura de uma instrução de uma localização na memória. A execução da instrução pode envolver várias operações e depende da natureza da instrução.

O processamento necessário para uma operação simples é chamado de ciclo de instrução. Usando a descrição simplificada de dois passos, exposta acima, o ciclo de instrução é ilustrado na Figura 3.3. Os dos passos são referidos como ciclo de extracção e ciclo de execução. A execução do programa é suspensa apenas, se a máquina for desligada, se ocorrer um erro não recuperável, ou se for encontrada uma instrução de programa que o suspenda.

Figura 3.3: Ciclo de instrução básico.
\begin{figure}
\end{figure}

Os Ciclos de Extracção e de Execução

No início de cada ciclo de instrução, o processador extrai uma instrução da memória. Num processador típica, um registo chamado contador de programa (PC) é usado para tomar conta da próxima instrução a extrair. A menos que instruído de outra forma, o processador incrementa sempre o PC depois da extracção de cada instrução, de forma a que possa extrair a próxima instrução na sequência (isto é, a instrução localizada no endereço de memória mais alto seguinte). Assim, por exemplo, considere um computador no qual cada instrução ocupa na memória uma palavra de 16-bits. Assuma que o contador de programa é ajustado para a posição 300. O processador em seguida extrai a instrução na localização 300. Nos ciclos de instrução seguintes, irá extrair instruções das localizações 301, 302, 303 e assim sucessivamente, como foi explicado.

A instrução extraída é carregada num registo do processador conhecida por registo de instrução (IR). A instrução está na forma de um código binário que especifica a acção a tomar pelo processador. O processador interpreta a instrução e efectua as acções requeridas. Em geral, estas acções caem em quatro categorias:

Figura 3.4: Características de uma máquina hipotética.
\begin{figure}
\end{figure}

Claro que a execução de uma instrução pode envolver uma combinação destas acções.

Consideremos um exemplo simples usando uma máquina hipotética que inclua as características listadas na figura 3.4. O processador contém um acumulador (AC) para guardar informação temporária. Tanto os dados como as instruções têm 16 bits de comprimento. Assim, é conveniente organizar a memória usando localizações, ou palavras, de 16 bits. O formato da instrução indica que podem existir $2^4 = 16$ códigos de operação diferentes e até $2^{12} - 4096$ (4K) palavras de memória podem ser directamente endereçáveis.

A Figura 3.5 ilustra a execução parcial de um programa, mostrando as porções relevantes da memória e dos registos do processador. A notação usada é hexadecimal.

Figura 3.5: Exemplo de um programa em execução.
\begin{figure}
\end{figure}

O fragmento de programa apresentado soma o conteúdo da palavra de memória no endereço $940_{16}$ e guarda o resultado na localização anterior. São necessárias três instruções que podem ser descritas por três ciclos de extracção e de execução:
  1. O contador de programa (PC) contém $300$, o endereço da primeira instrução. Este endereço é carregado no registo de instrução (IR). Notar que este processo envolve o uso de um registo de endereço de memória (MAR) e um registo tampão de memória (MBR). Por simplificação, estes registos intermédios são ignorados.
  2. Os 4 primeiros bits no registo IR indicam que o acumulador (AC) deve ser carregado, Os restantes 12 bits especificam o endereço, que é $940$.
  3. O PC é incrementado e extraída a próxima instrução.
  4. O conteúdo anterior do AC e o conteúdo da localização $941$ são adicionados e o resultado armazenado no AC.
  5. O PC é incrementado e extraída a próxima instrução.
  6. O conteúdo do AC é guardado na localização $941$.
Neste exemplo, três ciclos de instrução cada um consistindo de um ciclo de extracção e de um ciclo de execução são necessários para adicionar o conteúdo da localização $940$ ao conteúdo de $941$ Com um jogo de instruções mais complexo, seria necessário um número menor de ciclos. Muitas CPUs modernas incluem instruções que contêm mais do que um endereço. A instrução do PDP-11 expressa simbolicamente por ADD B,A guarda a soma do conteúdo das localizações $B$ e $A$ n localização de memória $A$. Ocorre um único ciclo de instruções com os seguintes passos:
  1. Extracção da instrução ADD
  2. Leitura do conteúdo da localização $A$ para a CPU.
  3. Leitura do conteúdo da localização $B$ para o processador. Para não perder o conteúdo de $A$, o processador tem de ter pelos menos dois registos para armazenar os valores da memória, em vez de um único acumulador.
  4. Adicionar os dois valores.
  5. Escrever o resulltado no processador para a localização de memória $A$.
Assim, o ciclo de execução para uma instrução particular pode envolver mais do que uma referência à memória. Também, em vez de referências à memória, uma instrução pode especificar uma operação de E/S. Com estas considerações adicionais presentes, a figura 3.6 fornece um olhar mais detalhado do ciclo de instrução básico sob a forma de um diagrama de estados. Para qualquer ciclo de instrução, alguns estador podem ser nulos e outros podem ser visitado mais do que uma vez. Estes estados podem ser descritos como segue: Os estados na parte superior da Figura 3.6 envolvem uma troca entre o processador e a memória ou módulo de E/S. Os estados na parte inferior do diagrama envolvem apenas operações internas do processador. O estado oac aparece duas vezes, uma vez que a instrução pode envolver uma leitura uma escrita ou ambas. Contudo, a acção efectuada durante aquele estado é no fundamental a mesma em ambos os casos e por isso é apenas necessário um identificador de estado.

Notar também que o diagrama permite múltiplos operandos e múltiplos resultados, uma vez que algumas instruções em algumas máquinas têm necessidade disso. Por exemplo, a instrução ADD A,B do PDP-11 resulta na seguinte sequência de instruções: iac, if, iod, oac, of, oac, of, do, oac, os.

Finalmente, em algumas máquinas, uma simples instrução pode especificar uma operação a ser efectuada num vector (lista uni-dimensional) de números ou cadeias de caracteres. Como a Figura 3.6 indica, isto envolveria operações repetidas de extracção de operandos e/ou de operações de armazenamento.

Figura 3.6: Diagrama de estados de um ciclo de instrução.
\begin{figure}
\end{figure}

Interrupções

Virtualmente todos os computadores fornecem um mecanismo através do qual outros módulos (E/S, memória) podem interromper o processamento normal do processador. A tabela 3.1 lista as classes mais comuns de interrupções. A natureza específica destas interrupções é examinada mais tarde neste livro, especialmente nos capítulos 6 e 11. Contudo, necessitamos de introduzir os conceitos, agora, para compreender mais claramente a natureza dos ciclo de instrução e as implicações das interrupções na estrutura de interconexão. O leitor não necessita de, nesta fase, estar preocupado com os detalhes da geração e processamento das interrupções, mas apenas prestar atenção à comunicação entre módulos que resulta das interrupções.

Tabela 3.1: Classes de interrupção.
\begin{table}
\end{table}


As interrupções servem em primeiro lugar como uma maneira de melhorar a eficiência de processamento. Por exemplo, a maior parte dos dispositivos externos são muito mais lentos do que os processadores. Suponhamos que o processador está a transferir dados para uma impressora usando o esquema de ciclo de instruções da figura 3.3. Depois de cada operação de escrita, o processador terá que suspender e ficar ocioso até que a impressora recuperar. O comprimento desta pausa pode ser da ordem das muitas centenas ou até milhares de ciclos de instrução que não envolvem a memória. Com interrupções o processador pode envolver-se na execução de outras instruções enquanto a operação de E/S está em progresso. A figura 3.7(a) ilustra este estado de coisas para a aplicação mencionada no último parágrafo. O programa do utilizador efectua uma série de chamadas de ESCRITA entremeadas com o processamento. Os segmentos de código 1,2 e 3 referem-se a sequências de instruções que não envolvem a E/S. As chamadas de ESCRITA são chamadas a um programa de E/S que é um utilitário do sistema e que irão efectuar a operação efectiva de E/S. O programa de E/S consiste de três secções: Porque a operação de E/S pode levar muito tempo a concluir, o programa de E/S suspende-se esperando pela conclusão da operação; assim, o programa do utilizador pára no ponto de chamada de ESCRITA por um período considerável de tempo.

Figura 3.7: Fluxo de controlo com e sem interrupção.
\begin{figure}
\end{figure}

Interrupções e o Ciclo de Instrução

Com interrupções, o processador pode ser envolvido na execução de outras instruções enquanto a operação de E/S está em progresso. Consideremos o fluxo de controlo na figura 3.7(b). Tal como antes, o programa do utilizador chega a um ponto em que faz uma chamada ao sistema sob a forma de uma chamada de ESCRITA. O programa de E/S que é evocado neste caso consiste apenas do código de preparação e o comando efectivo de E/S. Depois destas poucas instruções terem sido executadas, o controlo regressa ao programa do utilizador. Entretanto, o dispositivo exterior está ocupado a aceitar dados da memória do computador e a imprimi-los. Esta operação de E/S é efectuada concorrentemente com a execução de instruções do programa do utilizador.

Quando o dispositivo externo ficar pronto para ser servido, isto é, quando estiver pronto para aceitar mais dados do processador, o módulo de E/S para aquele dispositivo envia um sinal de pedido de interrupção para o processador. O processador responde suspendendo a operação do programa corrente, derivando para um programa de tratamento de interrupções de serviço específico daquele dispositivo de E/S e reassumindo a execução original depois do dispositivo ser servido. Os pontos em que tais interrupções ocorrem são indicados com asterisco na figura 3.7(b).

Do ponto de vista do programa do utilizador, a interrupção é apenas isto: uma interrupção da sequência normal de execução. Quando o processamento da interrupção estiver concluída, a execução é reassumida (figura 3.8). Assim, o programa do utilizador não tem de conter nenhum código especial para acomodar interrupções; o processador e o sistema de exploração são responsáveis por suspender o programa do utilizador e de o retomar no mesmo ponto.

Figura 3.8: Transferência de controlo através de interrupções.
\begin{figure}
\end{figure}

Para contemplar as interrupções, um ciclo de interrupção é adicionado ao ciclo de instruções tal como é mostrado na figura 3.9. No ciclo de interrupção, o processador faz um teste para ver se ocorreu alguma interrupção, indicada pela presença de um sinal de interrupção. Se não existirem interrupções pendentes, o processador prossegue para o ciclo de extracção e procura a próxima instrução do programa corrente. Se uma interrupção estiver pendente o processador faz o seguinte:
  1. Suspende a execução do programa correntemente a ser executado e salvaguarda o contexto. Isto significa guardar o endereço da próxima instrução a ser executada (o conteúdo do contador de programa) e outros dados relevantes para a actividade corrente do processador.
  2. Ajusta o contador do programa para o início da rotina de atendimento de interrupção.

Figura 3.9: Ciclo de instruções com interrupções.
\begin{figure}
\end{figure}

O processador agora prossegue para o ciclo de extracção e obtém a primeira instrução do programa de atendimento que irá servir o dispositivo. O programa de atendimento de interrupções, geralmente, faz parte do sistema de exploração. Tipicamente, este programa determina a natureza da interrupção e efectua as acções necessárias. Por exemplo, no exemplo que temos vindo a utilizar o atendedor determina qual o módulo de E/S que gerou a interrupção e pode derivar para um programa que envia mais dados para aquele modulo de E/S. Quando a rotina de atendimento estiver concluída, o processador pode retomar a execução do programa do utilizador no ponto de interrupção.

É claro que há algum trabalho adicional envolvido neste processo. Instruções extra tem de ser executadas (pela rotina de atendimento) para determinar a natureza da interrupção e para decidir as acções apropriadas. De qualquer forma, por causa do relativamente longo tempo que seria desperdiçado se simplesmente se ficasse à espera da operação de E/S, o processador pode ser usado com muito maior eficiência através do uso de interrupções.

Figura 3.10: Temporização do programa; espera curta de E/S.
\begin{figure}
\end{figure}

Para apreciar o ganho de eficiência, considere a figura 3.10 que é um diagrama temporal baseado no fluxo de controlo das figuras 3.7 (a) e 3.7 (b).

A figura 3.7 (b) e 3.10 assumem que o tempo requerido para a operação de E/S é relativamente curto: inferior ao tempo necessário para completar a execução das instruções entre as operações de escrita do programa do utilizador. O caso mais típico, especialmente para um dispositivo lento, tal como uma impressora, é que a operação de E/S demore mais tempo do que executar uma sequência de instruções do utilizador. A figura 3.7(c) indica este estado de coisas. Neste caso, o programa do utilizador chega à segunda chamada de ESCRITA antes que o operação de E/S evocada pela primeira chamada esteja completa. O resultado é que o programa do utilizador fica suspenso naquele ponto. Quando a operação precedente de E/S se completar, esta nova chamada de ESCRITA pode prosseguir e arrancar uma nova operação de E/S. A figura 3.11 mostra a temporização para esta situação com e sem o uso de interrupções.

Figura 3.11: Temporização do programa; espera longa de E/S.
\begin{figure}
\end{figure}

Podemos ver, ainda, que há um ganho de eficiência porque parte do tempo durante o qual a operação de E/S está a desenrolar-se, sobrepõe-se à execução de instruções do utilizador.

A figura 3.12 mostra um diagrama de ciclo de instrução revisto que inclui o processamento do ciclo de interrupção.

Figura 3.12: Diagrama de estados do ciclo de instrução com interrupções.
\begin{figure}
\end{figure}

Interrupções Múltiplas

A discussão anterior apenas tratou da ocorrência de uma simples interrupção. Suponhamos, contudo, que podem ocorrer múltiplas interrupções. Por exemplo, um programa pode estar a receber dados de uma linha de comunicações e a imprimir resultados. A impressora irá gerar interrupções sempre que completa as operações de impressão. O controlador de linha de comunicações irá gerar uma interrupção sempre que chega uma unidade de dados. A unidade pode ser um simples carácter ou um bloco, dependendo da natureza do protocolo de comunicações. Em qualquer dos casos, é possível ocorrerem interrupções de comunicação enquanto uma interrupção de impressão está a ser processada.

Duas abordagens podem ser feitas para tratar com múltiplas interrupções. A primeira é impedir interrupções enquanto uma interrupção está a ser processada. O impedimento de interrupções significa, simplesmente, que o processador pode e irá ignorar o sinal de pedido de interrupção. Se uma interrupção ocorrer durante aquele período, em geral, mantém-se pendente e irá ser testado pelo processador após o processador ter desimpedido as interrupções. Assim, quando um programa de utilizador está em execução e ocorre uma interrupção, são, imediatamente, impedidas as interrupções. Depois de concluída a rotina de tratamento de interrupções, antes de retomar o programa do utilizador as interrupções são desimpedidas e o processador verifica se ocorreram interrupções adicionais. Esta abordagem é simples e elegante, uma vez que as interrupções são manipuladas numa ordem estritamente sequencial (figura 3.13 (a)).

Figura 3.13: Transferência de controlo com múltiplas interrupções.
\begin{figure}
\end{figure}

O obstáculo à abordagem acima é que não toma em conta a prioridade relativa ou necessidades de tempos críticos. Por exemplo, quando chegam entradas na linha de comunicações, pode ser necessário absorvê-las rapidamente para deixar lugar para novas entradas. Se o primeiro lote não tiver sido processado, antes da chegada do segundo lote, os dados podem ser perder-se.

Uma segunda abordagem é definir prioridades para as interrupções e permitir a uma interrupção de mais alta prioridade levar a que seja interrompido um atendedor de interrupções de mais baixa prioridade (figura 3.13(b).

Como um exemplo da segunda abordagem, consideremos um sistema com três dispositivos de E/S: uma impressora, um disco e uma linha de comunicações, com prioridades crescente de 2, 4 e 5 respectivamente. A figura 3.14 ilustra uma possível sequência. Um programa de utilizador começa em $t=0$. Em $t=10$ ocorre uma interrupção da impressora; a informação do utilizador é colocada na pilha do sistema e a execução continua na rotina de serviço de interrupção de impressora (ISR).

Figura 3.14: Exemplo da sequência temporal de múltiplas interrupções.
\begin{figure}
\end{figure}

Enquanto esta rotina está ainda a ser executada, no instante $t=15$, ocorre uma interrupção de comunicações. Uma vez que a linha de comunicações tem uma prioridade mais alta do que a impressora, a interrupção é atendida. A ISR da impressora é interrompida, o seu estado é posto na pilha e a execução continua na ISR de comunicações. Enquanto esta rotina está a ser executada, ocorre uma interrupção do disco ($t=20$). Uma vez que esta interrupção é de prioridade inferior é simplesmente registada e a ISR de comunicações continua até a conclusão.

Quando a ISR termina ($t=25$) o estado anterior do processador, que é a ISR da impressora, é restaurado. Contudo, antes mesmo que uma simples instrução possa ser executada, o processador honra a interrupção do disco, de prioridade superior, e o controlo é transferido para a ISR do disco. Apenas é retomado o programa ISR da impressora quando aquela rotina termina ($t=35$). Quando, finalmente, aquela rotina termina o controlo retorna ao programa do utilizador.

Função de E/S

Antes, discutimos a operação do computador como sendo controlada pelo CPU e olhamos em primeiro lugar para a interacção entre o processador e a memória. A discussão apenas aludiu ao papel da componente E/S. Este papel é discutido em detalhe no capítulo 6, mas um resumo breve é apropriado aqui.

Um módulo de E/S pode trocar dados directamente com o processador. Tal como o processador pode iniciar uma leitura ou escrita com a memória, designando o endereço de uma localização específica, o processador pode também ler ou escrever informação de um módulo de E/S. Neste último caso, o processador identifica um dispositivo específico que é controlado por um módulo particular de E/S. Assim, uma sequência de instrução semelhante em forma à da figura 3.5 pode ocorrer, com instruções de E/S em vez de instruções de referência à memória.

Em alguns casos é desejável permitir que as transferências de E/S ocorram directamente com a memória. Em tais casos, o processador garante a um módulo de E/S a autoridade para ler ou escrever na memória, de forma a que a transferência possa ocorrer sem perturbar o processador. Durante tal tipo de trransferência o módulo de E/S emite comandos de leitura ou de escrita, libertando o processador da responsabilidade da transferência. Esta operação é conhecida por acesso directo a memória (DMA) e irá ser examinada com detalhe no capítulo 6. Por agaora, tudo o que necessitamos é saber que a estrutura de interligação do computador pode ter necessidade de interacção directa memória-E/S.

Estruturas de Interconexão

Um computador compreende um conjunto de componentes ou módulos de três tipos básicos (processador, memória e E/S) que comunicam entre si. Com efeito, um computador é uma rede de módulos básicos. Assim, têm de existir caminhos para ligar os módulos em conjunto.

Figura 3.15: Módulos de um computador.
\begin{figure}
\end{figure}

A colecção de caminhos que ligam os vários módulos é chamada estrutura de interconexão. O desenho desta estrutura irá depender das trocas que devem ser feitas entre módulos.

A figura 3.15 sugere os tipos de trocas que são necessários indicando as formas maiores de entrada e de saída para cada tipo de módulos:

A lista anterior define os dados a trocar. A estrutura de interconexão deve suportar os seguintes tipos de transferências: Ao longo dos anos, foram ensaiados um certo número de estruturas de interconexão. Sem dúvida que as mais comuns são o barramento e várias estruturas de múltiplos barramentos. O resto deste capítulo é dedicado a uma abordagem às estruturas de barramentos.

Barramentos de Interconexão

Um barramento é uma via de comunicação que liga dois ou mais dispositivos. Uma característica chave do barramento é que é um meio de transmissão partilhado. Múltiplos dispositivos ligam ao barramento e um sinal emitido por qualquer dispositivo fica disponível para ser recebido por todos os outros dispositivos agarrados ao barramento. Se dois dispositivos emitem durante o mesmo período de tempo, os seus sinais sobrepor-se-ão e tonar-se-ão adulterados. Por isso, apenas um dispositivo pode emitir com sucesso em cada momento.

Em muitos casos, um barramento compreende múltiplos caminhos, ou linhas, de comunicação. Cada linha é capaz de transmitir sinais representando os binários 1 e 0. Ao longo do tempo uma sequência de dígitos binários pode ser transmitida através de um simples linha. Tomados em conjunto, várias linhas de um barramento podem ser usadas para transmitir vários dígitos binários simultaneamente (em paralelo). Por exemplo, uma unidade de 8-bits pode ser transmitida através de oito linhas de barramento.

Os sistemas de computação contêm um certo número de diferentes barramentos que fornecem os caminhos entre componentes nos vários níveis de hierarquia do sistema de computação. Um barramento que liga os componentes principais (processador, memória e E/S) é chamado barramento de sistema. As estrutura mais comuns de interligação num computador são baseadas no uso de um ou mais barramentos.

Estrutura do Barramento

Um barramento de sistema consiste, tipicamente, de 50 a 100 linhas separadas. A cada linha é atribuído um significado ou função particular. Embora haja muitos desenhos diferentes de barramentos, em qualquer barramento as linhas podem ser classificadas em três grupos funcionais (Figura 3.16): dados, endereços e linhas de controlo. Adicionalmente, podem existir linhas de distribuição de potência que fornecem a alimentação dos módulos agarrados. As linhas de dados estabelecem o caminho para mover dados entre módulos de sistema. Estas linhas são colectivamente designadas por barramento de dados. O barramento de dados consiste, tipicamente, de 8, 16, ou 32 linhas separadas, linhas que são referidas como largura do barramento de dados.

Figura 3.16: Esquema de barramento de interconexão.
\begin{figure}
\end{figure}

Uma vez que cada linha pode transportar apenas um bit em cada momento, o número de linhas determina como podem ser transferidos muitos bits ao mesmo tempo. A largura do barramento de dados é um factor chave na determinação do rendimento global do sistema. Por exemplo, se o barramento de dados for de 8 bits de largura e cada instrução for de 16-bits de comprimento, então o processador tem de fazer o acesso ao módulo de memória duas vezes durante cada ciclo de instrução.

As linhas de endereço são usadas para designar a origem ou o destino dos dados no barramento de dados. Por exemplo, se o processador pretende ler uma palavra (8, 16, ou 32-bits) de dados da memória põe o endereço da palavra pretendida nas linhas de endereço. A largura do barramento de endereços determina, claramente, a máxima capacidade possível de memória do sistema. Para além disso, as linhas de endereço são, também, geralmente usadas para endereçar os portos de E/S. Tipicamente, os bits mais significativos são usados para seleccionar um módulo particular e os bit menos significativos seleccionam uma posição de memória ou de porto de E/S, dentro do módulo. Por exemplo, num barramento de 8-bits de largura, os endereços 01111111 e abaixo podem referenciar posições do módulo de memória (módulo 0) com 128 palavras de memória e os endereços 10000000 e acima referenciar dispositivos agarrados a um módulo de E/S (módulo 1).

As linhas de controlo são usadas para comandar o acesso e o uso das linhas de dados e linhas de endereços. Uma vez que as linhas de dados e de endereços são partilhadas por todos os componentes tem de existir um meio de controlar o seu uso. Os sinais de controlo transmitem tanto comandos como informação temporal entre módulos de sistema. Os sinais de tempo indicam a validade da informação de dados e de endereços. Os sinais de controlo especificam as operações a realizar. As linhas de controlo incluem tipicamente:

A operação do barramento é como segue: Se um módulo pretende enviar dados para outro, tem de fazer duas coisas: (1) obter o uso do barramento e (2) transferir os dados através do barramento. Se um módulo pretende pedir dados a um outro módulo tem de (1) obter o uso do barramento e (2) transferir o pedido para o outro módulo através de linhas apropriadas de controlo e de endereços. Deve então esperar que o segundo módulo envie os dados.

Fisicamente, o barramento de sistema é, na verdade, um certo número de condutores eléctricos paralelos. Estes condutores são linhas metálicas estampadas num cartão ou placa (placa de circuito impresso). O barramento estende-se através de todos os componentes de sistema, cada um dos quais se liga a alguma ou a todas as linhas do barramento. Um arranjo físico muito comum é apresentado na figura 3.17. Neste exemplo, o barramento compreende duas colunas de condutores verticais. Em intervalos regulares ao longo das colunas, há pontos de amarração sob a forma de ranhuras que se estendem horizontalmente para suportar uma placa de circuito impresso. Cada um dos componentes principais ocupam uma ou mais placas e encaixam no barramento através das ranhuras. O sistema na sua totalidade é preso num chassis.

Este arranjo é o mais conveniente. Pode ser adquirido um pequeno sistema de computação e mais tarde expandido (mais memória, mais E/S) através da junção de mais placas. Se um componente numa placa falhar, a placa pode ser facilmente removida e substituída.

Figura 3.17: Realização física típica de uma arquitectura de barramento.
\begin{figure}
\end{figure}

Hierarquia de Múltiplos Barramentos

Se um grande número de dispositivos forem ligados ao barramento o rendimento é afectado. Há duas causas principais :
  1. Em geral, quantos mais dispositivos estiverem agarrados ao barramento, maior o atraso de propagação. Este atraso determina o tempo que levam os dispositivos para coordenar o uso do barramento. Quando o controlo do barramento passa, frequentemente, de um para outro dispositivo, estes atrasos podem afectar significativamente o rendimento.
  2. O barramento pode tornar-se um gargalo à medida que a transferência agregada de dados pretendida e aproxima da capacidade do barramento. Este problema pode ser controlado em certa medida através do aumento da taxa de transferência, a que o barramento pode transportar dados, e através do uso de barramentos mais largos (e.g. aumentando o barramento de 32 para 64-bits). Contudo, uma vez que as taxas de transferência de dados geradas pelos dispositivos agarrados (e.g. controladores gráficos e de vídeo, interfaces de rede) estão a crescer rapidamente, isto é uma competição que em última instância os barramentos estão condenados a perder.
Em concordância, a maior parte dos sistemas de computação tiram partido de múltiplos barramentos, geralmente organizados numa hierarquia. Uma estrutura típica tradicional é mostrada na figura 3.18 (a). Há um barramento local que interliga o processador à a memória cache que pode suportar um ou mais dispositivos locais. O controlador de memória cache liga a memória cache não apenas a este barramento local, mas, também, a um barramento de sistema ao qual estão agarrados os restantes módulos de memória. Tal como é discutido no capítulo 4, o uso de uma estrutura de cache isola o processador da necessidade de fazer pedidos frequentes de acesso à memória principal. Assim, a memória principal pode ser deslocada do barramento local para o barramento de sistema. Desta forma, as transferências de E/S de e para a memória principal através do barramento do sistema, não interferem com a actividade do processador.

É possível ligar os controladores de E/S directamente ao barramento. Uma solução mais eficiente é recorrer a um ou mais barramentos de expansão para este efeito. O interface de um barramento de expansão faz a tamporização das transferências de dados entre o barramento de sistema e os controladores de E/S no barramento de expansão. Este arranjo permite ao sistema suportar uma vasta gama de dispositivos de E/S e ao mesmo tempo isolar o tráfico memória-processador, do tráfico de E/S.

Figura 3.18: Exemplos de configuração de barramentos.
\begin{figure}
\end{figure}

A figura 3.18 (a) mostra alguns exemplos típicos de dispositivos de E/S que podem ser pendurados ao barramento de expansão. Conexões de rede incluem redes para áreas locais (LAN), tal como, uma rede de 10-Mbps Ethernet e ligações a redes para áreas alargadas (WAN), tal como, uma rede de comutação por pacotes. O SCSI3.1 é ele próprio um tipo de barramento usado para suportar dispositivos locais de discos e outros periféricos. Uma porta série pode ser usada para ligar uma impressora ou um explorador de imagem.

Esta arquitectura tradicional do barramento é razoavelmente eficiente mas começa a dar sinais de fraqueza à medida que os dispositivos de E/S exibem rendimentos cada vez mais elevados. Em resposta a esta crescente demanda, uma abordagem comum tomada pela indústria é construir um barramento de elevada velocidade que seja completamente integrado com o resto do sistema, necessitando apenas de uma ponte entre o barramento do processador e o barramento de alta-velocidade. Esta arranjo é às vezes conhecido como uma arquitectura mezzanine.

A figura 3.18 (b) mostra uma realização típica desta abordagem. De novo, há um barramento local que liga o processador ao controlador de cache, o qual por sua vez é ligado a um barramento de sistema que suporta a memória principal.

O controlador de cache é integrado numa ponte, ou dispositivo de tamporização, que se liga ao barramento de alta velocidade. Este barramento suporta a ligação a redes (LAN) de alta-velocidade, tais como (FDDI)3.2 a 100Mbps, controladores de vídeo e gráficos de estações de trabalho, assim como, controladores de interface para barramentos locais de periféricos incluindo SCSI e P1394. Este último arranjo é um barramento de alta-velocidade especificamente projectado para suportar dispositivos de E/S de elevada capacidade. Dispositivos de baixa-velocidade são ainda suportados através de um barramento de expansão, com um interface para tamporização do tráfego entre o barramento de expansão e o barramento de elevada-velocidade.

As vantagens deste arranjo é que o barramento de alta velocidade traz dispositivos com exigências de alta-velocidade para uma integração mais próxima do processador e ao mesmo tempo é independente do processador. Assim, são toleradas diferenças entre velocidades e definições de linhas de sinal do processador e dos barramentos de alta-velocidade. As mudanças na arquitectura do processador não afectam o barramento de alta-velocidade e vice-versa.

Elementos do projecto de Barramento

Embora exista uma variedade de diferentes realizações de barramentos, há uns poucos parâmetros básicos ou elementos de projecto que servem para classificar e diferenciar os barramentos. A tabela 3.2 lista os elementos chave.

Tabela 3.2: Elementos do projecto de barramentos.
\begin{table}
\end{table}


Tipos de Barramentos

As linhas do barramento podem ser separadas em dois tipos genéricos: dedicadas e multiplexadas. Uma linha dedicada de barramento está permanente atribuída a uma função ou a um subconjunto físico de componentes do computador.

Um exemplo de dedicação funcional é o uso de linhas separadas de endereço e de dados que é comum a muitos barramentos. Contudo, não é essencial. Por exemplo, informação de endereços e de dados pode ser transmitida através do mesmo conjunto de linhas usando uma linha de controlo de Validação de Endereço. No início da transferência o endereço é colocado no barramento e a linha de Validação de Endereços é activado. Neste ponto, cada módulo tem um período de tempo específico para copiar os endereços e determinar se é o módulo endereçado. O endereço é depois removido do barramento e as mesmas ligações são usadas para as subsequentes transferências de dados de leitura ou de escrita. Este método de usar as mesma linhas para múltiplos propósitos é chamada multiplexação no tempo.

A vantagem da multiplexação no tempo é o uso de menos linhas o que poupam espaço e, habitualmente, em custo. A desvantagem é a necessidade de circuitos mais complexos dentro de cada módulo. Há, também, uma potencial redução do rendimento uma vez que certos eventos que partilham as mesmas linhas não poderem ocorrer em paralelo.

A dedicação física refere-se ao uso de múltiplos barramentos, cada um dos quais liga apenas um subconjunto de módulos. Um exemplo típico é o uso de um barramento de E/S para interligar todos os módulos de E/S; este barramento é por sua vez ligado ao barramento principal através de algum tipo de adaptador de módulos de E/S. A vantagem potencial da dedicação física é o elevado desempenho, porque há menor contenção do barramento, a desvantagem é o aumento do tamanho e do custo do sistema.

Método de Arbitragem

Em todos, menos nos sistemas mais simples, mais do que um módulo pode necessitar de controlar o barramento. Por exemplo, um módulo de E/S pode necessitar de ler ou de escrever directamente na memória, sem enviar dados para o processador. Uma vez que apenas uma unidade, em cada momento, pode transmitir com sucesso através barramento, é necessário algum método de arbitragem. Os vários métodos podem ser grosseiramente classificados como sendo centralizados ou distribuídos. Num esquema centralizado, um dispositivo físico simples, referido como árbitro ou controlador de barramento é responsável pela atribuição de tempo no barramento. O dispositivo pode ser um módulo separado ou parte do processador. Num esquema distribuído, não há controlador central. Pelo contrário, cada módulo contém lógica de controlo de acesso e os módulos actuam em conjunto para partilhar o barramento. Com ambos os métodos de arbitragem, a intenção é designar um dispositivo, o processador ou um módulo de E/S como mestre. O mestre pode então iniciar a transferência de dados (e.g. leitura ou escrita) com qualquer outro dispositivo que age como servo para esta troca particular. Veremos exemplos de ambos os métodos de arbitragem mais tarde nesta secção.

Temporização

A temporização refere a forma pela qual os eventos no barramento são coordenados. Com temporização síncrona, a ocorrência de eventos no barramento é determinada por um relógio. O barramento inclui uma linha de relógio através da qual o relógio transmite uma sequência regular alternada de 1s e de 0s de igual duração. Uma transmissão 1-0 simples é referida como um ciclo de relógio ou ciclo de barramento e define uma fatia de tempo. Todos os outros dispositivos no barramento podem ler a linha de relógio e todos os eventos começam no início de um ciclo de relógio. A figura 3.19 (a) mostra o diagrama temporal de uma operação de leitura síncrona (ver o apêndice 3A para uma apresentação de diagramas temporais).

Figura 3.19: Temporização de operação de leitura.
\begin{figure}
\end{figure}

Outros sinais de barramento podem mudar na subida do sinal de relógio (com um insignificante atraso de reacção). A maior parte dos eventos ocupam um simples ciclo de relógio. Neste exemplo simples, o processador emite um sinal de leitura e coloca um endereço de memória no barramento de endereços. Emite também um sinal de arranque para indicar a presença de endereços e de informação de controlo no barramento. Um módulo de memória reconhece os endereços e, depois de um atraso de um ciclo, coloca os dados e um sinal de reconhecimento no barramento.

Com temporização assíncrona, a ocorrência de um evento no barramento segue e depende da ocorrência de um evento precedente. No exemplo simples da figura 3.19(b), o processador coloca endereços e sinais de leitura no barramento. Depois de uma pausa para que aqueles sinais estabilizem, emite um sinal (MSYNC)3.3, indicando a presença de um endereço válido e sinais de controlo. O módulo de memória responde com os dados e um sinal SSYNC3.4, indicando a resposta.

A temporização síncrona é mais simples de realizar e de testar. Contudo, é menos flexível do que a temporização assíncrona. Porque todos os dispositivos num barramento síncrono estão presos a uma taxa fixa de relógio, o sistema não pode tirar partido dos avanços em rendimento dos dispositivos. Com a temporização assíncrona, uma mistura de dispositivos lentos e rápidos, usando tecnologias antigas e novas, podem partilhar um barramento. Veremos exemplos de temporização síncrona e assíncrona.

Largura do Barramento

Já tocámos o conceito de largura do barramento. A largura do barramento de dados tem um impacto no rendimento do sistema: quanto mais largo for o barramento, maior o número de bits transferidos num só instante. A largura do barramento de endereços tem um impacto na capacidade do sistema: quanto mais largo for o barramento de endereços, maior a gama de localizações que podem ser referenciadas.

Tipos de Transferências de Dados

Finalmente, um barramento suporta vários tipos de transferências de dados, tal como é ilustrado na figura 3.20, Todos os barramentos suportam transferências tanto de escrita (mestre para servo) como de leitura (servo para mestre). No caso de um barramento com multiplexação endereços/dados o barramento é usado em primeiro lugar para especificar o endereço e em seguida para transferir os dados. Para uma operação de leitura, há tipicamente uma espera enquanto os dados são extraídos do servo para serem postos no barramento. Tanto na leitura como na escrita, pode existir um atraso, para o que resta da operação, se for necessário ir através de arbitragem para obter o controlo do barramento (i.e. apoderar-se do barramento para requer uma leitura ou escrita e de novo se apoderar do barramento para efectuar a leitura ou a escrita).

No caso de barramentos dedicados para endereços e dados, o endereço é posto no barramento de endereços e permanece lá enquanto os dados são postos no barramento. Para uma operação de escrita, o mestre coloca os dados no barramento logo que o endereço estiver estabilizado e o servo tenha tido a oportunidade para reconhecer seu endereço. Para um operação de leitura, o servo põe os dados no barramento de dados logo que tenha reconhecido o seu endereço e extraído os dados.

Há, também, várias operações combinadas permitidas por alguns barramentos. Uma operação de leitura-escrita-modificada é simplesmente uma leitura imediatamente seguida de uma escrita no mesmo endereço. O endereço é difundido apenas uma vez no início da operação. A operação total é tipicamente indivisível para poder prevenir o acesso ao mesmo elemento por outros potenciais mestres de barramento. O principal objectivo desta capacidade é proteger recursos de memória partilhada em sistemas de multi-programação (ver capítulo 7).

Leitura-após-escrita é uma operação indivisível que compreende uma escrita imediatamente seguida de uma leitura do mesmo endereço. A operação de leitura pode ser efectuada para efeito de confirmação.

Alguns barramentos, também, suportam transferências de dados em bloco. Neste caso, um ciclo de endereço é seguido de $n$ ciclos de dados. O primeiro item de dados é transferido para ou de um endereço específico; os restantes itens de dados são transferidos de ou para endereços subsequentes.

Figura 3.20: Tipos de transferências de dados.
\begin{figure}
\end{figure}

PCI

O PCI3.5 é um barramento recente de elevada largura de banda, independente do processador que pode funcionar como mezzanine ou como barramento periférico. Comparado com outras especificações de barramentos comuns, O PCI apresenta melhor rendimento para sub-sistemas de E/S de alta-velocidade (e.g. adaptadores de visor gráficos, controladores para interfaces de rede, controladores de disco, etc.). A norma actual permite o uso de até 64 linhas de dados a 33 MHz, para transferências de 264MOctetos/seg ou 2.112 Gb/s. Mas não é apenas a alta-velocidade que torna o PCI atractivo. O PCI é especificamente projectado para ir de encontro aos requisitos económicos da E/S dos sistemas actuais; são necessários muito poucos circuitos integrados para implementar e suportar outros barramentos pendurados no barramento PCI.

A Intel começou a trabalhar no PCI em 1990 para os seus sistemas baseados no Pentium. A Intel cedo entregou todas as patentes ao domínio público e promoveu a criação de uma associação industrial, O PCI SIG, para desenvolver e continuar a manter a compatibilidade das especificações PCI. O resultado foi que o PCI tem vindo a ser largamente adoptado e está a encontrar um uso crescente em computadores pessoais, estações de trabalho e sistemas servidores. A versão actual, PCI 2.0, foi licenciada em 1993. Porque a especificação é de domínio público e é suportada por uma importante parcela da indústria de micro-processadores e periféricos, os produtos PCI construídos por diferentes construtores são compatíveis.

O PCI foi projectado para suportar uma variedade de configurações baseadas em micro-processadores. Em concordância, oferece um conjunto de funções de uso geral. Faz uso de temporização síncrona e um esquema de arbitragem centralizado.

A figura 3.21 (a) mostra um uso típico do PCI num sistema uni-processador. Uma combinação de controlador de DRAM e ponte para o barramento PCI oferece um acoplamento compacto com o processador e a habilidade para transferir dados a alta-velocidade. A ponte actua como um tampão de dados de forma a que a velocidade do barramento possa diferir da capacidade de E/S do processador. Num sistema multi-processador (Figura 3.21 (b), uma ou mais configurações PCI podem ser interligados através de pontes ao barramento de sistema dos processadores. O barramento de sistema suporta apenas as unidades processador/ cache, memória principal e pontes PCI. De novo, o uso de pontes mantém o PCI independente da velocidade do processador, ao mesmo tempo que oferece a habilidade para receber e entregar dados rapidamente.

Figura 3.21: Exemplo de configurações PCI.
\begin{figure}
\end{figure}

Estrutura do Barramento

O PCI pode ser configurado como um barramento de 32 ou 64-bits. A tabela 3.3. define as 50 linhas de sinal mandatárias. Estes pinos são divisíveis nos seguintes grupos funcionais:

Tabela 3.3: Linhas de sinais mandatórias em PCI.
\begin{table}
\end{table}


Cumulativamente, a especificação PCI define 50 linhas de sinal opcionais (Tabela 3.4) divididas nos seguintes grupos funcionais de pinos:

Tabela 3.4: Linhas de sinais opcionais em PCI.
\begin{table}
\end{table}


Comandos PCI

A actividade do barramento ocorre sob a forma de transações entre um iniciador, ou mestre, e um alvo. Quando um mestre no barramento adquire o controlo do barramento, determina o tipo de transacção que irá ocorrer a seguir. Durante a fase de transacção, as linhas C/BE são usadas para sinalizar o tipo de transacção. Os comandos são O Reconhecimento de Interrupções é um comando de leitura para o dispositivo que funciona como um controlador de interrupção no barramento PCI. As linhas de endereços não são usadas durante a fase de endereçamento e as linhas de habilitação de octetos indicam o tamanho do identificador de interrupção de retorno.

O comando Ciclo Especial é usado pelo iniciador para difundir uma mensagem para um ou mais alvos.

Os comandos de Leitura e Escrita da E/S são usados para transferir dados entre o iniciador e um controlador de E/S. Cada dispositivo de E/S tem o seu próprio espaço de endereçamento e as linhas de endereços são usadas para indicar um dispositivo particular e para especificar os dados transferidos para ou daquele dispositivo. O conceito de endereçamento de E/S é explorado no capítulo 6.

Os comandos de Leitura e Escrita de Memória são usados para especificar a transferência de uma rajada de dados, que ocupa um ou mais ciclos de memória. A interpretação destes comandos está dependente do controlador de memória suportar ou não o protocolo PCI para transferências entre a memória e a cache. Em caso afirmativo, a transferência de dados para e da memória é tipicamente em termos de linhas de cache, ou blocos. Os três comandos de leitura de memória tem o uso apresentado na Tabela 3.5. O comando de escrita é usado para transferir dados, em um ou mais ciclos de dados, para a memória.

Tabela 3.5: Interpretação dos comandos de leitura em PCI.
\begin{table}
\end{table}


O comando de Invalidação e Escrita de Memória transfere dados em um ou mais ciclos para a memória. Cumulativamente, garante que pelo menos uma linha de cache é escrita. Este comando suporta a função cache de escrita de uma linha para a memória.

Os dois comandos de configuração habilitam um mestre a ler e actualizar os parâmetros de configuração de um dispositivo ligado ao PCI. Cada dispositivo PCI pode incluir até 256 registos internos que são usados durante a iniciação do sistema para configura o dispositivo.

O comando Ciclo Duplo de Endereçamento é usado por um iniciador para indicar que está a ser usado um endereçamento de 64-bits.

Transferência de Dados

Toda a transferência de dados no barramento PCI é uma transacção simples que compreende uma fase de endereços e uma ou mais fases de dados. Nesta discussão, ilustramos uma operação típica de leitura; a operação de escrita é processada similarmente.

A figura 3.22 mostra a temporização da transacção de leitura. Todos os eventos são sincronizados pela transição descendente do relógio que ocorre no meio de cada ciclo de relógio. Os eventos mais significativos, etiquetados no diagrama, são os seguintes:

  1. [a.] Logo que um mestre no barramento assume o controlo, pode iniciar a transacção impondo FRAME. Esta linha mantém a imposição até que o iniciador esteja pronto para completar a última fase de dados. O iniciador coloca também o endereço inicial no barramento de endereços e o comando de leitura nas linhas C/BE.
  2. [b.] No início do segundo ciclo o dispositivo alvo irá reconhecer o seu endereço nas linhas AD.
  3. [c.] O iniciador cessa de alimentar o barramento de endereços. Um ciclo de andar à volta (indicado pelas duas setas circulares) é necessário em todas as linhas de sinal que possam ser alimentadas por mais do que um dispositivo, de forma a que o esgotamento dos sinais de endereço prepare o barramento para ser usado pelo dispositivo alvo. O iniciador muda a informação nas linhas de C/BE para designar quais são as linhas de AD a serem usadas na transferência para os dados correntemente endereçados (de 1 a 4 octetos). O iniciador, também, impõe IRDY para indicar que está pronto para o primeiro item de dados.
  4. [d.] O dispositivo seleccionado impõe DEVSEL para indicar que reconheceu o seu endereço e vai responder. Coloca o dados solicitado nas linhas de AD e impõe TRDY para indicar que estão presentes dados válidos no barramento.
  5. [e.] O iniciador lê o dado no início do ciclo 4 e muda, conforme o necessário, as linhas de habilitação de octetos, em preparação para a leitura seguinte.
  6. [f.] Neste exemplo, o alvo necessita de algum tempo para preparar o segundo bloco de dados para transmissão. Consequentemente, baixa o sinal TRDY para sinalizar o iniciador que não irá haver dados no ciclo seguinte. Em conformidade, o iniciador não lê as linhas de dados no início do quinto ciclo de relógio e não muda a habilitação de octeto durante aquele ciclo. O bloco de dados é lido no início do ciclo 6.
  7. [g.] Durante o ciclo 6, o alvo coloca o terceiro item de dados no barramento. Contudo, no exemplo, o iniciador não está ainda pronto para ler o item de dados (e.g. há uma condição de tampão temporário cheio). Por isso baixa IRDY. Isto fazer com que o alvo possa manter o terceiro item no barramento durante um ciclo extra de relógio.
  8. [h.] O iniciador sabe que a terceira transferência de dados é a última. Impõe IRDY para sinalizar que está pronto para completar a transferência.
  9. [i.] O iniciador baixa IRDY, regressando o barramento ao estado de ócio e o alvo baixa TRDY e DEVSEL.

Figura 3.22: Operação de Leitura no PCI.
\begin{figure}
\end{figure}

Arbitragem

O PCI recorre a um esquema de arbitragem centralizada e síncrona no qual cada mestre tem um sinal único para requerimento e para concessão. Estas linhas de sinais estão presas a um árbitro central (Figura 3.23) e um simples esquema requerimento-concessão é usado para obter o acesso ao barramento.

A especificação PCI não impõe um algoritmo particular de arbitragem. O árbitro pode usar uma abordagem primeiro a chegar primeiro a ser servido, uma abordagem andar à volta ou qualquer outra espécie de esquema de prioridade.

Figura 3.23: Árbitro num barramento PCI.
\begin{figure}
\end{figure}

Um mestre PCI tem de submeter-se à arbitragem para cada transacção que pretenda efectuar, consistindo uma transacção simples numa fase de endereço seguida por um ou mais fases contíguas de dados.

A figura 3.24 é um exemplo no qual os dispositivos A e B são submetidos à decisão de posse do barramento. A seguinte sequência ocorre:

Figura 3.24: Arbitragem de barramento PCI entre dois mestres.
\begin{figure}
\end{figure}

  1. [a.] Em algum ponto anterior ao início do ciclo 1, A impõe o sinal REQ. O árbitro faz a amostragem do sinal no início do ciclo 1 de relógio.
  2. [b.] Durante o ciclo 1, B requisita o uso do barramento impondo o seu sinal REQ.
  3. [c.] Ao mesmo tempo, o árbitro impõe GNT-A para garantir a A o acesso ao barramento.
  4. [d.] O mestre A faz a amostragem de GNT-A no início de ciclo 2 e toma conhecimento que lhe foi concedido o acesso ao barramento. Descobre, também, IRDY e TRDY em baixo, indicando que o barramento está livre. Em concordância, impõe FRAME e coloca a informação de endereço no barramento de endereços e o comando no barramento C/BE (não visível). Mantém REQ-A, porque tem uma segunda transação a efectuar a seguir a esta.
  5. [e.] O árbitro de barramento faz a amostragem de todas as linhas GNT no início do ciclo 3 e toma uma decisão de conceder o barramento a B na próxima transacção. Impõe GNT-B e baixa GNT-A. B não irá poder usar o barramento até que este retorne ao estado de ócio.
  6. [f.] A FRAME baixa indica que a última e (única) transferência de dados está em progresso. Coloca os dados no barramento e assinala o alvo com IRDY. O alvo lê os dados no início do próximo ciclo de relógio.
  7. [g.] No início do ciclo 5, B descobre IRDY e FRAME em baixo e consequentemente pode tomar o controlo do barramento impondo FRAME. Também põe em baixo a linha de REQ porque apenas pretende efectuar uma transacção.
A seguir, ao mestre A é concedido o acesso ao barramento na próxima transacção.

É de notar que a arbitragem ocorre ao mesmo tempo que o mestre corrente está a efectuar uma transferência de dados. Consequentemente, não há perda de ciclos de relógio durante a arbitragem. Isto é referido por arbitragem escondida

Resumo

A especificação Futurebus+ é uma das normalizações tecnicamente mais complexas alguma vez produzida. A norma cobre a camada lógica, a camada física e, perfis, recomendações práticas e, ainda referências para outras dcoumentos normativos. O resultado é uma especificação de barramento que pode ser usada para o barramento memória-processador ou que pode competir com o PCI no suporte aos periféricos de elevada-velocidade. Tanto o PCI como o Futurebus+ suportam taxas de transferência muito elevadas. A chave distintiva é que o PCI é dirigido para uma implementação de baixo custo que recorre a uma área física mínima, enquanto que o Futurebus+ pretende dar flexibilidade e uma vasta funcionalidade para de ir de encontro às necessidades de uma vasta variedade de sistemas de elevado rendimento, em particular sistemas de alto-custo. -----------------------------------------

Leitura Recomendada

A literatura sobre barramento e outras estruturas de interconexão e, surpreendemente, não muito extensa. [ALEX93] inclui um tratamento em profundidade das estruturas de barramento e temas sobre transferências em barramento, incluindo a descrição de vários barramentos específicos.

A mais clara extensa descrição do PCI é em [SHAN94a]. [SOLA94] também contém informação consistente sobre o PCI.

ALEX93 Alexandridis, N. Design of Micro-processor-Based Systems. Englewood Cliffs, NJ: Prentice Hall, 1993. SHAN94a Shanley, T., and Anderson, D. PCI Systems Architecture. Richardson, TX: Mindshare Press, 1994. SOLA94 Solari, E., and Willse, G. PCI Hardware and Software: Architecture and Design. San Diego, CA: Annabooks, 1994.


next up previous contents
Next: Memória Interna Up: Arquitectura e Organização Interna Previous: Evolução dos Computadores e

2000-05-10