
Em um nível superior, um computador consiste em CPU (unidade de processamento central), memória e
componentes de EIS, com um ou mais módulos de cada tipo. Esses componentes são interconectados de alguma
forma para conseguir a função básica do computador, que é executar programas. Assim, em um nível mais alto,
podemos descrever um sistema de computação explicando o comportamento externo de cada componente,
ou seja, os dados e sinais de controle que ele troca com outros componentes; e detalhando a estrutura de
interconexão e os controles exigidos para gerenciar o uso da estrutura de interconexão.
Essa visão de alto nível da estrutura e da função é importante por causa de seu poder explicativo na compreensão
da natureza de um computador. Igualmente importante é seu uso para entender as questões cada vez
mais complexas da avaliação de desempenho.
Ter conhecimento da estrutura e função de alto nível gera compreensão
dos gargalos do sistema, caminhos alternativos, da magnitude de falhas do sistema caso um componente
falhe e da facilidade de acrescentar melhorias de desempenho. Em muitos casos, os requisitos para maior
poder do sistema e capacidades à prova de falhas estão sendo atendidos pela mudança do projeto, em vez de
simplesmente aumentar a velocidade e a confiabilidade dos componentes individuais.
Este capítulo enfoca as estruturas básicas utilizadas para a interconexão dos componentes do computador.
Como base, o capítulo começa com uma breve análise dos componentes básicos e de suas exigências de interface.
Temos, então, um panorama funcional e, em seguida, somos capacitados para examinar o uso de barramentos
para interconectar os componentes do sistema.
COMPONENTES DO COMPUTADOR
Praticamente todos os projetos de computadores modernos são baseados
em conceitos desenvolvidos por John von Neumann no Institute for Advanced Studies, em Princeton.
Um projeto como esse é conhecido como arquitetura de von Neumann e é baseado em três conceitos principais:
► Dados e instruções são armazenados em uma única memória de leitura e escrita.
► O conteúdo dessa memória é endereçável pela localização, sem considerar o tipo de dados contido ali.
► A execução ocorre em um padrão sequencial (a menos que modificado explicitamente) de uma instrução
para a seguinte.
O raciocínio por trás desses conceitos foi discutido no Capítulo 2, mas merece ser resumido aqui. Existe
um pequeno conjunto de componentes lógicos básicos que podem ser combinados de diversas maneiras para
armazenar dados binários e realizar operações aritméticas e lógicas sobre esses dados. Se houver um cálculo em
particular a ser feito, uma configuração de componentes lógicos projetados especificamente para este cálculo
poderia ser construída. Podemos pensar no processo de conectar vários componentes na configuração desejada
como uma forma de programação. O "programa" resultante está na forma de hardware e é chamado de programa
hardwired.
Agora, considere esta alternativa: suponha que queremos construir uma configuração de propósito geral
das funções aritméticas e lógicas. Esse conjunto de hardware realizará diversas funções sobre os dados, dependendo
dos sinais de controle aplicados ao hardware. No caso original do hardware customizado, o sistema aceita
dados e produz resultados . Com o hardware de propósito geral, o sistema aceita dados e sinais de
controle e produz resultados. Assim, em vez de religar o hardware para cada novo programa, o programador
simplesmente precisa fornecer um novo conjunto de sinais de controle.
Como os sinais de controle devem ser fornecidos? A resposta é simples, porém sutil. O programa inteiro, na
realidade, é uma sequência de etapas. Em cada etapa, alguma operação aritmética ou lógica é realizada sobre
alguns dados. Para cada pessoa, um novo conjunto de sinais de controle é necessário. Vamos oferecer um código
exclusivo para cada conjunto possível de sinais de controle, e vamos acrescentar ao hardware de uso geral um
segmento que pode aceitar um código e gerar sinais de controle.
A programação agora é muito mais fácil. Em vez de religar o hardware para cada novo programa, tudo o
que precisamos fazer é oferecer uma nova sequência de códigos. Cada código, com efeito, é uma instrução, e
parte do hardware interpreta cada instrução e gera sinais de controle. Para distinguir esse novo método de programação,
uma sequência de códigos ou instruções é chamada de software.
Dois componentes importantes do sistema: um interpretador de instrução e um módulo
para funções aritméticas e lógicas de propósito geral. Esses dois constituem a CPU. Vários outros componentes

são necessários para resultar em um computador funcionando. Dados e instruções precisam ser colocados no
sistema. Para isso, precisamos de algum tipo de módulo de entrada. Esse módulo contém componentes básicos
para aceitar dados e instruções em alguma forma e convertê-los para uma forma interna de sinais que possam ser
usados pelo sistema. Também é necessário um meio de informar resultados, e este tem a forma de um módulo de
saída. Juntos, estes são chamados de componentes de EIS.
Mais um componente é necessário: um dispositivo de entrada que trará dados e instruções sequencialmente.
Mas um programa não é invariavelmente executado de forma sequencial; ele pode saltar (por exemplo,
a instrução jump do IAS). De modo semelhante, as operações sobre dados podem exigir acesso a mais do que
apenas um elemento de cada vez em uma sequência predeterminada. Assim, deverá haver um lugar para armazenar
instruções e dados temporariamente. Esse módulo é chamado de memória, ou memória principal, para
distingui-la do armazenamento externo, ou dispositivos periféricos. Von Neumann indicou que a mesma memória
poderia ser usada para armazenar tanto instruções quanto dados.
A Figura ilustra esses componentes de alto nível e sugere as interações entre eles. A CPU troca dados
com a memória. Para essa finalidade, ela normalmente utiliza dois registradores internos (à CPU): um registrador
de endereço de memória (MAR), que especifica o endereço na memória para a próxima leitura ou escrita,
e um registrador de buffer de memória (MBR), que contém os dados a serem escritos na memória ou recebe
os dados lidos da memória. De modo semelhante, um registrador de endereço de EIS (1/0 AR) especifica um
dispositivo de EIS em particular. Um registrador de buffer de EIS (1/0 BR) é usado para a troca de dados entre
um módulo de EIS e a CPU.
Um módulo de memória consiste em um conjunto de locais, definidos por endereços numerados de maneira
sequencial. Cada local contém um número binário que pode ser interpretado como uma instrução ou um
dado. Um módulo de EIS transfere dados dos dispositivos externos para a CPU e a memória, e vice-versa. Ele
contém buffers internos para manter esses dados temporariamente, até que possam ser enviados.
Tendo examinado rapidamente esses principais componentes, agora, vamos passar a uma visão geral de
como esses componentes funcionam juntos para executar programas.

FUNÇÃO DO COMPUTADOR
A função básica realizada por um computador é a execução de um programa, que consiste em um conjunto de instruções armazenadas na memória. O processador faz o trabalho real executando instruções especificadas no programa. Esta seção oferece uma visão geral dos principais elementos da execução do programa. Em sua forma mais simples, o processamento de instrução consiste em duas etapas: o processador lê (busca) instruções da memória, uma de cada vez, e executa cada instrução. A execução do programa consiste em repetir o processo de busca e execução de instrução. A execução da instrução pode envolver diversas operações e depende da natureza da instrução ver, por exemplo, a parte inferior da Figura. O processamento exigido para uma única instrução é chamado de ciclo de instrução. Usando a descrição simplificada em duas etapas dada anteriormente, o ciclo de instrução é representado na Figura 3.3. As duas etapas são conhecidas como ciclo de busca (fetc/1) e ciclo de execução. A execução do programa só termina se a máquina for desligada, se houver algum tipo de erro irrecuperável ou se for encontrada uma instrução do programa que interrompa o computador

Busca e execução de instruções
No início de cada ciclo de instrução, o processador busca uma instrução da memória. Em um processador
típico, um registrador chamado contador de programa (PC) mantém o endereço da instrução a ser buscada
em seguida. A menos que seja solicitado de outra maneira, o processador sempre incrementa o PC após cada
busca de instrução, de modo que buscará a próxima instrução em sequência (ou seja, a instrução localizada no
próximo endereço de memória mais alto). Assim, por exemplo, considere um computador em que cada instrução
ocupa uma palavra de memória de 16 bits. Suponha que o contador de programa esteja definido no local
de memória 300, onde o endereço local se refere a uma palavra de 16 bits. O processador em seguida buscará a
instrução no local 300. Nos ciclos de instrução seguintes, ele buscará instruções dos locais 301,302,303 e assim
por diante. Essa sequência pode ser alterada, como explicamos logo a seguir.
A instrução lida é carregada em um registrador no processador, conhecido como registrador de instrução
(IR). A instrução contém bits que especificam a ação que o processador deve tomar. O processador interpreta a
instrução e realiza a ação solicitada. Em geral, essas ações estão em uma destas quatro categorias:
► Processador-memória: os dados podem ser transferidos do processador para a memória ou da memória
para o processador.
► Processador-EIS: os dados podem ser transferidos de ou para um dispositivo periférico, transferindo
entre o processador e um módulo de EIS.
► Processamento de dados: o processador pode realizar alguma operação aritmética ou lógica sobre os dados.
► Controle: uma instrução pode especificar que a sequência de execução seja alterada. Por exemplo, o
processador pode buscar uma instrução do local 149, que especifica que a próxima instrução seja do local
182. O processador se lembrará desse fato definindo o contador de programa como 182. Assim, no próximo
ciclo de busca, a instrução será lida do local 182, em vez de 150.
A execução de uma instrução pode envolver uma combinação dessas ações.
Considere um exemplo simples, usando uma máquina hipotética, que inclui as características listadas na
Figura O processador contém um único registrador de dados, chamado acumulador (AC). Instruções e
dados possuem 16 bits de extensão. Assim, é conveniente organizar a memória usando palavras de 16 bits. O
formato de instrução oferece 4 bits para o opcode, de modo que pode haver até 24 = 16 opcodes diferentes,e até
212 = 4096 (4K) palavras de memória podem ser endereçadas diretamente.

A Figura ilustra uma execução parcial de programa, mostrando as partes relevantes dos registradores
de memória e processador.1 O fragmento de programa mostrado soma o conteúdo da palavra de memória no
endereço 940 ao conteúdo da palavra de memória no endereço 941 e armazena o resultado no segundo local.
Três instruções, que podem ser descritas como três ciclos de busca e três de execução, são necessárias:
1. O PC contém 300, o endereço da primeira instrução. Essa instrução (o valor 1940 em hexadecimal) é
carregada no registrador de instrução IR, e o PC é incrementado. Observe que esse processo envolve o
uso do registrador de endereço de memória (MAR) e o registrador de buffer de memória (MBR). Para
simplificar, esses registradores intermediários são ignorados.
2. Os 4 primeiros bits (primeiro dígito hexadecimal) no IR indicam que o AC deve ser carregado. Os 12
bits restantes (três dígitos hexadecimais) especificam o endereço (940) de onde os dados devem ser
carregados.
3. A próxima instrução (5941) é buscada do local 301, e o PC é incrementado.
4. O conteúdo antigo do AC e o conteúdo do local 941 são somados, e o resultado é armazenado no AC.
5. A próxima instrução (2941) é buscada do local 302, e o PC é incrementado.
6. O conteúdo do AC é armazenado no local 941.
Neste exemplo, três ciclos de instrução, cada um consistindo em um ciclo de busca e um ciclo de execução,
são necessários para somar o conteúdo do local 940 ao conteúdo de 941. Com um conjunto de instruções mais
complexo, menos ciclos seriam necessários. Alguns processadores mais antigos, por exemplo, incluíam instruções
contendo mais de um endereço de memória. Assim, o ciclo de execução para determinada instrução em
tais processadores poderia envolver mais de uma referência à memória. Além disso, em vez de referências à
memória, uma instrução pode especificar uma operação de E/S.
Por exemplo, o processador PDP-11 inclui uma instrução, expressa simbolicamente como ADD B,A, que
armazena a soma do conteúdo dos locais de memória B e A ao local de memória A. Ocorre um único ciclo de
instrução com as seguintes etapas:

► Buscar a instrução .
► Ler o conteúdo do local de memória A no processador.
► Ler o conteúdo do local de memória B no processador. Para que o conteúdo de A não seja perdido, o
processador precisa ter pelo menos dois registradores para armazenar valores de memória, em vez de um
único acumulador.
► Somar os dois valores.
► Escrever o resultado do processador no local de memória A.
Assim, o ciclo de execução para determinada instrução pode envolver mais de uma referência à memória.
Além disso, em vez de referências à memória, uma instrução pode especificar uma operação de E/S. Lembrando
essas considerações adicionais, a Figura oferece uma visão mais detalhada do ciclo de instrução básico da
Figura. A figura está na forma de um diagrama de estado. Para qualquer ciclo de instrução dado, alguns estados
podem ser nulos e outros podem ser visitados mais de uma vez. Os estados podem ser descritos da seguinte forma:
► Cálculo de endereço de instrução (iac, do inglês, instruction address calculation): determina o endereço
da próxima instrução a ser executada. Normalmente, isso envolve acrescentar um número fixo ao endereço
da instrução anterior. Por exemplo, se cada instrução tem 16 bits de extensão e a memória é organizada
em palavras de 16 bits, então some 1 ao endereço anterior. Se, em vez disso, a memória é organizada
em bytes (palavras de 8 bits) endereçáveis individualmente, então some 2 ao endereço anterior.
► Bus ca da instrução (if, do inglês, instruction fetch): lê a instrução de seu local da memória para o
processador.
► Decodificação da operação da instrução (iod, do inglês, instruction operation decoding): analisa a instrução
para determinar o tipo de operação a ser realizado e o operando ou operandos a serem utilizados.
► Cálculo do endereço do operando (oac, do inglês, operation address calculation): se a operação envolve
referência a um operando na memória ou disponível via E/S, então determina o endereço do operando.
► Busca do operando (of, do inglês, operationfetch): busca o operando da memória ou o lê da E/S.
► Operação dos dados (do, do inglês, data operation): realiza a operação indicada na instrução.
► Armazenamento do operando (os, do inglês, operand store): escreve o resultado na memória ou envia
para a E/S.
Os estados na parte superior da Figura envolvem uma troca entre o processador e a memória ou um
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, pois uma instrução pode envolver uma leitura, uma escrita ou ambos. Porém,
a ação realizada durante esse estado é fundamentalmente a mesma nos dois casos, e, por isso, apenas um único
identificador de estado é necessário.

Observe também que o diagrama possibilita múltiplos operandos e resultados, pois algumas instruções em
algumas máquinas exigem isso. Por exemplo, a instrução ADD A,B do PDP-11 resulta na seguinte sequência de
estados: iac, if, iod, oac, of, oac, of, do, oac, os.
Finalmente, em algumas máquinas, uma única instrução pode especificar uma operação a ser realizada
sobre um vetor (array unidimensional) de números ou uma string (array unidimensional) de caracteres. Como a
Figura indica, isso envolveria operações repetitivas de busca e/ou armazenamento de operando.
Interrupções
Praticamente todos os computadores oferecem um mecanismo por meio do qual outros módulos (E/S,
memória) podem interromper o processamento normal do processador. A Tabela lista as classes mais comuns
de interrupções. A natureza específica dessas interrupções será examinada mais adiante neste livro, em
especial nos capítulos 7 e 14. Contudo, é preciso introduzir o conceito agora, para se entender mais claramente a
natureza do ciclo de instrução e as implicações das interrupções sobre a estrutura de interconexão. O leitor não
precisa se preocupar neste estágio com os detalhes da geração e processamento de interrupções, mas apenas se
concentrar na comunicação entre os módulos, resultante das interrupções.
As interrupções são fornecidas em primeiro lugar como um modo de melhorar a eficiência do processamento.
Por exemplo, a maioria dos dispositivos externos é muito mais lenta do que o processador. Suponha que
o processador esteja transferindo dados a uma impressora usando o esquema de ciclo de instrução da Figura
Após cada operação de escrita, o processador deve parar e permanecer ocioso até que a impressora o alcance.
A extensão dessa pausa pode estar na ordem de muitas centenas ou mesmo milhares de ciclos de instrução
que não envolvem memória. Claramente, esse é um grande desperdício de uso do processador.
A Figura ilustra esse estado de coisas. O programa do usuário realiza uma série de chamadas WRITE
intercaladas com processamento. Os segmentos de código 1, 2 e 3 referem-se às sequências de instruções que
não envolvem E/S. As chamadas WRITE são para um programa de EIS que é um utilitário do sistema e que
realizará a operação de E/S real. O programa de E/S consiste em três seções:
► Uma sequência de instruções, rotuladas como na figura, para preparar para a operação de E/S real. Isso
pode incluir a cópia dos dados para a saída em um buffer especial e a preparação dos parâmetros para um
comando de dispositivo.
► O comando de EIS real. Sem o uso de interrupções, quando esse comando é emitido o programa precisa
esperar pelo dispositivo de EIS para realizar a função solicitada (ou sondar o dispositivo periodicamente).
O programa poderia esperar simplesmente realizando uma operação de teste repetidamente,
para determinar se a operação de E/S terminou.
► Uma sequência de instruções, rotulada como 5 na figura, para completar a operação. Isso pode incluir a
marcação de um flag, indicando o sucesso ou a falha da operação.

INTERRUPÇÕES E O CICLO DE INSTRUÇÃO
Com as interrupções, o processador pode estar engajado na execução
de outras instruções enquanto uma operação de EIS está em andamento. Considere o fluxo de controle
na Figura. Como antes, o programa do usuário alcança um ponto em que faz uma chamada do sistema na
forma de uma chamada WRITE. O programa de EIS que é invocado, nesse caso, consiste apenas no código de
preparação e no comando de EIS real. Depois que essas poucas instruções tiverem sido executadas, o controle
retorna ao programa do usuário. Enquanto isso, o dispositivo externo está ocupado aceitando e imprimindo
dados vindos da memória do computador. Essa operação de EIS é realizada simultaneamente com a execução
de instruções no programa do usuário.
Quando o dispositivo externo está pronto para ser atendido - ou seja, quando estiver pronto para aceitar
mais dados do processador - , o módulo de EIS para o dispositivo externo envia um sinal de requisição de interrupção
ao processador. O processador responde suspendendo a operação do programa atual, desviando para
um programa para atender a esse dispositivo de EIS em particular, conhecido como tratador de interrupção,
e retomando a execução original depois que o dispositivo for atendido. Os pontos em que essas interrupções
ocorrem são indicados por um asterisco na Figura.
Vamos tentar esclarecer o que se passa na Figura. Temos um programa de usuário que contém dois
comandos WRITE. Há um segmento de código no início, então um comando WRITE, então um segundo segmento
de código, então um segundo comando WRITE, então um terceiro e final segmento de código. O comando
WRITE invoca o programa de EIS fornecido pelo SO. De modo similar, o programa EIS consiste em
um segmento de código, seguido por um comando EIS, seguido por outro segmento de código. O comando EIS
invoca uma operação de hardware de EIS.

Do ponto de vista do programa do usuário, uma interrupção é apenas isto: uma interrupção da sequência
de execução normal. Quando o processamento da interrupção termina, a execução é retomada (Figura 3.8).
Assim, o programa do usuário não precisa conter qualquer código especial para acomodar as interrupções; o
processador e o sistema operacional são responsáveis por suspender o programa do usuário e depois retomá-lo
no mesmo ponto.
Para acomodar as interrupções, um ciclo de interrupções é acrescentado ao ciclo de instrução, como mostra
a Figura. No ciclo de interrupção, o processador verifica se houve alguma interrupção, que é indicada pela
presença de um sinal de interrupção. Se nenhuma interrupção estiver pendente, o processador prossegue para
o ciclo de busca, lendo a próxima instrução do programa atual. Se uma interrupção estiver pendente, o processador
faz o seguinte:
► Suspende a execução do programa que está sendo executado e salva seu contexto. Isso significa salvar o
endereço da próxima instrução a ser executada (conteúdo atual do contador de programa) e quaisquer
outros dados relevantes à atividade atual do processador.
► Armazena no contador do programa o endereço inicial de uma rotina de tratamento de interrupções.

O processador, agora, continua com o ciclo de busca, obtendo a primeira instrução da rotina de tratamento
de interrupção, que tratará a interrupção. É comum o programa tratador de interrupção fazer parte do sistema
operacional. Normalmente, esse programa determina a natureza da interrupção e realiza quaisquer ações necessárias.
No exemplo que usamos, o tratador determina qual módulo de E/S gerou a interrupção e pode desviar-
se para um programa que escreverá mais dados nesse módulo de E/S. Quando a rotina de tratamento de interrupção
terminar, o processador poderá retomar a execução do programa do usuário no ponto da interrupção.
É evidente que existe algum overhead envolvido nesse processo. Instruções extras precisam ser executadas
(no tratador de interrupção) para se determinar a natureza da interrupção e se decidir sobre a ação apropriada.
Apesar disso, em razão do tempo relativamente grande que seria desperdiçado pela simples espera por uma
operação de E/S, o processador pode ser empregado de modo muito mais eficiente com o uso de interrupções.
Para apreciar o ganho na eficiência, considere a Figura, que é um diagrama de tempo baseado no fluxo
de controle nas figuras. Nessa figura, os segmentos do código de programa do usuário estão destacados
em cinza escuro, e os segmentos do código de programa de E/S estão destacados em cinza claro. A Figura
mostra o caso em que as interrupções são empregadas. O processador deve esperar enquanto a operação
de E/S é realizada.
,

As figuras consideram que o tempo exigido para a operação de E/S é relativamente curto: menos do que para completar a execução das instruções entre as operações de escrita no programa do usuário. Nesse caso, o segmento do código etiquetado 2 é interrompido. Uma porção do código (2a) executa (enquanto a operação de E/S é realizada) e, então, a interrupção ocorre (após a conclusão da operação de E/S). Após a interrupção ser atendida , a execução é retomada com o restante do segmento de código 2 (2b ). O caso mais típico, sobretudo para um dispositivo lento como uma impressora, é a operação de E/S levar muito mais tempo do que a execução de uma sequência de instruções do usuário. A Figura 3.7c indica esse estado de coisas. Nesse caso, o programa do usuário alcança a segunda chamada WRITE antes que a operação de E/S gerada pela primeira chamada termine. O resultado é que o programa do usuário está travado nesse ponto. Quando a operação de E/S anterior terminar, essa nova chamada WRITE poderá ser processada, e uma nova operação de E/S poderá ser iniciada. A Figura mostra a temporização para essa situação com e sem o uso de interrupções. Podemos ver que ainda existe um ganho na eficiência, pois parte do tempo durante o qual a operação de E/S está sendo realizada se sobrepõe à execução das instruções do usuário. A Figura 3.12 mostra um diagrama de estado do ciclo de instruções revisado, que inclui o processamento do ciclo de interrupção. INTERRUPÇÕES MÚLTIPLAS A discussão até aqui focou apenas a ocorrência de uma única interrupção. Suponha, porém, que ocorram múltiplas interrupções. Por exemplo, um programa pode estar recebendo dados de uma linha de comunicações e imprimindo resultados. A impressora gerará uma interrupção toda vez que completar uma operação de impressão. O controlador da linha de comunicação gerará uma interrupção toda vez que uma unidade de dados chegar. A unidade poderia ser um único caractere ou um b loco, dependendo da natureza do controle das comunicações. De qualquer forma, é possível que uma interrupção de comunicações ocorra enquanto uma interrupção de impressora esteja sendo processada.


Duas técnicas podem ser utilizadas para lidar com múltiplas interrupções. A primeira é desativar as inte r rupções
enquanto uma interrupção estiver sendo processada. Uma interrupção desabilitada significa simplesmente
que o processador pode ignorar e ignorará esse sinal de requisição de interrupção. Se uma interrupção
ocorrer durante esse tempo, ela, de modo geral, permanecerá pendente e será verificada pelo processador depois
que ele tiver habilitado as interrupções. Assim, quando um programa do usuário estiver sendo executado e
houver uma interrupção, as interrupções serão imediatamente desabilitadas. Depois que a rotina de tratamento
de interrupção terminar, as interrupções serão habilitadas antes que o programa do usuário retome, e o processador
verificará se houve interrupções adicionais. Essa técnica é boa e simples, pois as interrupções são tratadas
em ordem estritamente sequencial .
A desvantagem da técnica mencionada é que ela não leva em consideração a prioridade relativa ou necessidades
de tempo crítico. Por exemplo, quando a entrada chega da linha de comunicações, ela pode precisar ser
absorvida rapidamente, para dar espaço para mais entrada. Se o primeiro lote de entrada não for processado
antes que o segundo lote chegue, dados poderão ser perdidos.
Uma segunda técnica é definir prioridades para interrupções e permitir que uma interrupção de maior
prioridade faça com que um tratamento de interrupção com menor prioridade seja interrompido (Figura 3.13b ).
Como um exemplo dessa segunda técnica, considere um sistema com três dispositivos de E/S: uma impressora,
um disco e uma linha de comunicações, com prioridades cada vez maiores de 2, 4 e 5, respectivamente. A Figura
ilustra uma possível sequência. Um usuário começa em t = O. Em t = 10, ocorre uma interrupção da impressora;
a informação do usuário é colocada na pilha do sistema, e a execução continua na rotina de serviço de
interrupção (ISR - do inglês, Interrupt Service Routine). Enquanto essa rotina ainda está sendo executada,
em t = 15, ocorre uma interrupção de comunicaçã.o. Como a linha de comunicações tem prioridade mais alta
que a impressora, a interrupção é considerada. A ISR da impressora é interrompida, seu estado é colocado na
pilha, e a execução continua na ISR de comunicação. Enquanto essa rotina está sendo executada, ocorre uma
interrupção de disco (t = 20). Como essa interrupção tem prioridade menor, ela é simplesmente retida, e a ISR
de comunicação é executada até o final.
Quando a ISR de comunicação termina (t = 25), o estado anterior do processador, que é a execução da ISR
de impressora, é restaurado. Porém, antes mesmo que uma única instrução nessa rotina possa ser executada,
o processador aceita a interrupção de disco de maior prioridade e transfere o controle para a ISR de disco.
Somente quando essa rotina termina (t = 35) é que a ISR de impressora é retomada. Quando a última rotina
termina (t = 40), o controle finalmente retorna ao programa do usuário.


Função de E/S
Até aqui, discutimos a operação do computador de acordo com o controle do processador e vimos principalmente a interação entre processador e memória. A discussão apenas aludiu ao papel do componente de EIS. Esse papel é discutido com detalhes no Capítulo 7, mas apresentamos um rápido resumo aqui. Um módulo de EIS (por exemplo, um controlador de disco) pode trocar dados diretamente com o processador. Assim como o processador pode iniciar uma leitura ou escrita com a memória, designando o endereço de um local específico, o processador também pode ler ou escrever dados em um módulo de EIS. Neste último caso, o processador identifica um dispositivo específico que é controlado por um módulo de EIS em particular. Assim, poderia ocorrer uma sequência de instruções semelhante em formato à da Figura, com instruções de EIS em vez de instruções de referência à memória. Em alguns casos, é desejável permitir que as trocas de EIS ocorram diretamente com a memória. Nesse caso, o processador concede a um módulo de EIS a autoridade de ler ou escrever na memória, de modo que a transferência entre EIS e memória pode ocorrer sem que o processador fique preso à operação de EIS. Durante essa transferência, o módulo de EIS emite comandos de leitura ou escrita à memória, tirando do processador a responsabilidade pela troca. Essa operação é conhecida como acesso direto à memória (DMA, do inglês Direct Memory Access) e é examinada no Capítulo 7.
ESTRUTURAS DE INTERCONEXÃO
Um computador consiste em um conjunto de componentes ou módulos de três tipos básicos (processador,
memória e EIS) que se comunicam entre si. Com efeito, um computador é uma rede de módulos básicos. Assim,
é preciso haver caminhos para a conexão dos módulos.
O conjunto de caminhos conectando os diversos módulos é chamado de estrutura de interconexão. O projeto
dessa estrutura depende das trocas que precisam ser feitas entre os módulos.
A Figura sugere os tipos de trocas que são necessárias, indicando as principais formas de entrada e
saída para cada tipo de módulo:2
► Memória: normalmente, um módulo de memória consiste em N palavras de mesmo tamanho. Cada palavra
recebe um endereço numérico exclusivo (O, 1, ... , N -1). Uma palavra de dados pode ser lida ou escrita
na memória. A natureza da operação é indicada por sinais de controle de leitura e escrita. O local para a
operação é especificado por um endereço.
► Módulo de E/S: partindo de um ponto de vista interno (ao sistema de computação), a EIS é funcionalmente
semelhante à memória. Existem duas operações, leitura e escrita. Além disso, um módulo
de EIS pode controlar mais de um dispositivo externo. Podemos nos referir a cada uma das interfaces
para um dispositivo externo como uma porta dando a cada uma um endereço exclusivo (por exemplo,
O, 1, ... , M - 1). Além disso, existem caminhos de dados externos para entrada e saída de dados
com um dispositivo externo. Por fim, um módulo de EIS pode ser capaz de enviar sinais de interrupção
ao processador.
► Processador: o processador lê instruções e dados, escreve dados após o processamento e usa sinais de
controle para controlar a operação geral do sistema. Ele também recebe sinais de interrupção.
A lista anterior define os dados a serem trocados. A estrutura de interconexão deve admitir os seguintes
tipos de transferências:
► Memória para processador: o processador lê uma instrução ou uma unidade de dados da memória.
► Processador para memória: o processador escreve uma unidade de dados na memória.
► E/S para processador: o processador lê dados de um dispositivo de EIS por meio de um módulo de EIS.
► Processador para E/S: o processador envia dados para o dispositivo de EIS.
► E/S de ou para a memória: para esses dois casos, um módulo de EIS tem permissão para trocar dados
diretamente com a memória, sem passar pelo processador, usando o DMA.

INTERCONEXÃO DE BARRAMENTO
O barramento foi o meio dominante da interconexão de componentes de sistema computacional por décadas.
Para computadores de propósito geral, ele deu lugar gradualmente a várias estruturas de interconexão
ponto a ponto, que agora dominam o desenvolvimento do sistema computacional. Contudo, as estruturas de
barramento ainda são comumente usadas para os sistemas embarcados, sobretudo os microcontroladores. Nesta
seção, damos uma visão geral da estrutura de barramento. O Apêndice C ( disponível em inglês na Sala Virtual)
proporciona mais detalhes.
Um barramento é um caminho de comunicação que conecta dois ou mais dispositivos. Uma característica-
chave de um barramento é que ele é um meio de transmissão compartilhado. Diversos dispositivos conectam-
-se ao barramento, e um sinal transmitido por qualquer um dos dispositivos está disponível para recepção por
todos os outros dispositivos conectados ao barramento. Se dois dispositivos transmitem durante o mesmo período
de tempo, seus sinais serão sobrepostos e ficarão distorcidos. Assim, somente um dispositivo de cada vez
pode transmitir com sucesso.
Tipicamente, um barramento consiste em múltiplos caminhos de comunicação, ou linhas. Cada linha é
capaz de transmitir sinais representando o binário 1 e o binário O. Com o tempo, uma sequência de dígitos binários
pode ser transmitida por uma única linha. Juntas, várias linhas de um barramento podem ser usadas para
transmitir dígitos binários simultaneamente (em paralelo). Por exemplo, uma unidade de dados de 8 bits pode
ser transmitida por oito linhas de barramentoOs sistemas de computação contêm diversos barramentos diferentes, que oferecem caminhos entre os componentes
em diversos níveis da hierarquia do sistema de computação. Um barramento que conecta os principais
componentes do computador (processador, memória, EIS) é chamado de barramento do sistema. As estruturas
de interconexão de computador mais comuns são baseadas no uso de um ou mais barramentos do sistema.
Um barramento do sistema consiste, normalmente, em cerca de 50 a centenas de Linhas separadas. Cada
Linha recebe um significado ou função em particular. Embora existam muitos projetos de barramento diferentes,
em qualquer barramento as Linhas podem ser classificadas em três grupos funcionais (Figura 3.16): Linhas
de dados, endereços e controle. Além disso, pode haver Linhas de distribuição de tensão, que fornecem tensão
elétrica aos módulos conectados.
As linhas de dados oferecem um caminho para movimentação de dados entre os módulos do sistema. Essas
Linhas, coletivamente, são chamadas de barramento de dados. O barramento de dados pode consistir em 32, 64,
128 ou ainda mais linhas separadas, sendo que o número de Linhas é conhecido como a largura do barramento
de dados. Como cada Linha só pode transportar 1 bit de cada vez, o número de linhas determina quantos bits
podem ser transferidos de uma só vez. A largura do barramento de dados é um fator-chave para determinar o
desempenho geral do sistema. Por exemplo, se o barramento de dados tiver 32 bits de largura e cada instrução
tiver um tamanho de 64 bits, então o processador precisará acessar o 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 deseja ler uma palavra (8, 16 ou 32 bits) de dado da memória, ele coloca o
endereço da palavra desejada nas linhas de endereço. Claramente, a largura do barramento de endereços determina
a capacidade de memória máxima possível do sistema. Além do mais, as linhas de endereço também
costumam ser usadas para endereçar portas de EIS. Normalmente, os bits de ordem mais alta são usados para
selecionar um módulo em particular no barramento, e os bits de ordem mais baixa selecionam um local de memória
ou porta de EIS dentro do módulo. Por exemplo, em um barramento de endereço de 8 bits, o endereço
01111111 e mais baixos poderiam referenciar locais em um módulo de memória (módulo O) com 128 palavras
de memória, e o endereço 10000000 e mais altos poderiam referenciar dispositivos conectados a um módulo
de EIS (módulo 1).
As linhas de controle são usadas para controlar o acesso e o uso das linhas de dados e endereço. Como as
Linhas de dados e endereço são compartilhadas por todos os componentes, é preciso haver um meio de controlar
seu uso. Os sinais de controle transmitem informações de comando e temporização entre os módulos do sistema.
Os sinais de temporização indicam a validade da informação de dados e endereço. Os sinais de comando
especificam operações a serem realizadas. As linhas de controle típicas incluem:
► Escrita de memória: permite que os dados no barramento sejam escritos no local endereçado.
► Leitura de memória: permite que os dados do local endereçado sejam colocados no barramento.
► Escrita de E/S: permite que os dados no barramento sejam enviados para a porta de EIS endereçada.
► Leitura de E/S: permite que os dados da porta de EIS endereçada sejam colocados no barramento.
► ACK de transferência: indica que dados foram aceitos ou colocados no barramento.
► Solicitação de barramento (bus request): indica que um módulo precisa obter controle do barramento.
► Concessão de barramento (bus grant): indica que um módulo solicitante recebeu controle do barramento.
► Requisição de interrupção (interrupt request): indica que uma interrupção está pendente.

► ACK de interrupção (interrupt acknowledge): confirma que a interrupção pendente foi reconhecida.
► Clock: é usado para operações de sincronização.
► Reset: inicializa todos os módulos.
A operação do barramento é a seguinte. Se um módulo deseja enviar dados para outro, ele precisa fazer
duas coisas: (1) obter o uso do barramento e (2) transferir dados por meio do barramento. Se um módulo quiser requisitar dados de outro módulo, ele deve (1) obter o uso do barramento e (2) transferir uma requisição
ao outro módulo pelas linhas de controle e endereço apropriadas. Depois, ele deve esperar que esse segundo
módulo envie os dados.
INTERCONEXÃO PONTO A PONTO
A arquitetura de barramento compartilhada foi por décadas a técnica padrão para a interconexão entre o processador e outros componentes (memória, EIS e assim por diante). Mas os sistemas contemporâneos se baseiam cada vez mais na interconexão de sistema ponto a ponto, em vez de se basearem nos barramentos compartilhados.
A principal razão que conduz essa mudança foram as restrições elétricas encontradas com o aumento da frequência dos barramentos sincronizados largos. Em taxas cada vez mais altas, tornou-se cada vez mais difícil realizar as funções de sincronização e arbitração em tempo hábil. Além do mais, com o advento dos chips multicore, com diversos processadores e memória significativa em um único chip, percebeu-se que o uso de um barramento compartilhado convencional no mesmo chip aumentou as dificuldades da elevação da taxa de dados e da redução da latência do barramento para acompanhar o processador. Em comparação com o barramento compartilhado, a interconexão ponto a ponto tem menor latência, maior taxa de dados e melhor escalabilidade. Nesta seção, analisamos um exemplo importante e representativo da técnica de interconexão ponto a ponto: QuickPath Interconnect (QPI), da Intel, que foi apresentada em 2008.
A seguir, apresentamos características significativas da QPI e de outros esquemas de interconexão ponto a ponto:
► Conexões diretas múltiplas: múltiplos componentes dentro de um sistema aproveitam as conexões diretas emparelhadas de outros componentes. Isso elimina a necessidade de arbitração encontrada em sistemas de transmissão compartilhada.
► Arquitetura de protocolo em camadas: como encontrado em ambientes de rede, como redes de dados baseados em TCPIIP, essas interconexões em nível de processador usam uma arquitetura de protocolo em camadas, em vez do simples uso de sinais de controle encontrado nas disposições de barramento compartilhado.
► Transferência de dados em pacotes: os dados não são enviados simplesmente como um stream de bits. Em vez disso, eles são enviados como uma sequência de pacotes, cada um contendo cabeçalho de controle e códigos de controle de erro.
A Figura ilustra o uso típico da QPI em um computador multicore.As ligações de QPI (indicadas pelos pares de seta cinza escuro na figura) formam uma estrutura de troca que possibilita que os dados se movam através da rede. As conexões de QPI diretas podem ser estabelecidas entre cada par de processadores de core. Se o core A na Figura precisa acessar o controlador da memória no core D, ele envia seus pedidos por meio dos cores B e C, que devem, por sua vez, encaminhar o pedido ao controlador de memória no core D. De modo similar, os sistemas maiores, com oito ou mais processadores, podem ser construídos usando processadores com três ligações e roteando por meio dos processadores intermediários. Além disso, a QPI é usada para conectar a um módulo de EIS, chamado de concentrador de entrada e saída (IOH; em inglês, 1/0 hub ). A IOH age como uma chave direcionando o tráfego para e a partir dos dispositivos de EIS. Geralmente, nos sistemas mais novos, a ligação da IOH para o controlador do dispositivo de EIS usa uma tecnologia de interconexão chamada de PCI Express (PCie ), descrita adiante neste capítulo. A IOH traduz os protocolos de QPI e seus formatos para os protocolos de PCie e seus formatos. Um core também se liga a uma memória principal (geralmente, a memória usa uma tecnologia de memória aleatória de acesso dinâmico [DRAM]) usando um barramento de memória dedicada.

Define-se QPI como uma arquitetura de protocolo de quatro camadas,3 que abrange as seguintes camadas
(Figura):
► Física: consiste em fios reais que carregam os sinais, bem como circuitos e lógica para suportar as características necessárias para a transmissão e recepção de ls e Os. A unidade de transferência da camada física
é de 20 bits, que é chamada de Phit (unidade física [em inglês,physical unit]).
► Ligação: responsável pela transmissão confiável e pelo controle de fluxo. A unidade de camada de ligação
de transferência consiste em uma Flit (unidade de controle de fluxo [ em inglês,jlow contrai unit]) de 80 bits.
► Roteamento: proporciona a estrutura de redirecionamento dos pacotes através dos caminhos.
► Protocolo: um conjunto de regras de alto nível para troca de pacotes de dados entre os dispositivos. Um
pacote é compreendido por um número inteiro de Flits.

OPI - Camada física
A Figura mostra a arquitetura física da porta QPI. Essa porta consiste em 84 ligações individuais, agrupadas da seguinte forma. Cada caminho de dados consiste em um par de fios que transmitem dados de um bit
por vez; o par é chamado de via. Há 20 vias de dados em cada direção (transmite e recebe), além de uma via de
clock em cada direção. Assim,A QPI é capaz de transmitir 20 bits em paralelo em cada direção. A unidade de 20
bits é chamada de phit. As velocidades de sinalização típicas da ligação em produtos atuais solicitam operações
de 6,4 GT/s (transferências por segundo). Com 20 bits por transferência, que somam até 16 GB/s, e desde que as
ligações envolvam pares bidirecionais dedicados, a capacidade total é de 32 GB/s.
As vias em cada direção são agrupadas em quatro quadrantes de 5 vias cada. Em algumas aplicações, a
ligação pode também operar em metade ou um quarto da largura a fim de reduzir o consumo de energia ou
contornar as falhas.
A forma de transmissão em cada via é conhecida como sinalização diferencial ou transmissão balanceada.
Com a transmissão balanceada, os sinais são transmitidos como uma corrente que se move por um condutor
e retorna por outro. O valor binário depende da diferença de tensão. Em geral, uma linha tem um valor de
tensão positiva e a outra tinha tem tensão zero, e uma tinha está associada ao binário 1 e a outra ao binário O.
Especificamente, a técnica usada pela QPI é conhecida como sinalização diferencial de baixa tensão (LVDS [ em
inglês, Low-Voltage Differential Signaling]). Em uma implementação comum, o transmissor injeta uma pequena
corrente em um fio ou pelo outro, dependendo do nível lógico a ser enviado. A corrente passa por um resistor
no ponto de recepção e, então, retorna na direção oposta pelo outro fio. O receptor sente a polaridade da tensão
por meio de um transistor para determinar o nível lógico.
Outra função desempenhada pela camada física é que ela gerencia a conversão entre flits de 80 bits e fhits
de 20 bits, usando a técnica conhecida como distribuição multivia. Os flits podem ser considerados um stream de
bits que é distribuído através das linhas de dados, por meio do método round robin (primeiro bit para a primeira
via, segundo bit para a segunda via etc.), como ilustrado na Figura 3.20. Essa técnica possibilita que a QPI atinja
taxas de dados muito altas ao implementar ligação física entre duas portas como canais paralelos
múltiplos.

OPI - Camada de ligação
A camada de ligação QPI desempenha duas funções-chave: controle de fluxo e controle de erro. Essas funções
são desempenhadas como parte do protocolo de camada de ligação QPI e operam no nível da flit ( unidade de controle de fluxo). Cada flit consiste em um corpo de mensagem de 72 bits e um código de controle de en-o de 8 bits,
chamado de CRC (em inglês, Cyclic Redundancy Check). Discutimos os códigos de controle de erro no Capítulo 5.
O corpo do flit consiste em informação de dados ou de mensagem. As flits de dados transferem os bits reais
de dados entre os cores e entre um core e o IOH. As flits de mensagem são usadas para algumas funções como
controle de erro e coerência de cache. Discutimos a coerência de cache nos capítulos 5 e 17.
A função de controle de fluxo é necessária para assegurar que a entidade de QPI de envio não sobrecarregue uma entidade de QPI de recebimento ao enviar dados mais rápido do que o receptor pode processar e
para limpar os buffers para receberem mais dados. Para controlar o fluxo de dados, a QPI faz uso de um esquema
de créditos. Durante a inicialização, é dado a um remetente um número de conjunto de créditos para enviar flits
a um receptor. Sempre que uma flit for enviada ao receptor, o remetente diminui seus contadores de crédito por
um crédito. Sempre que um buffer for liberado no receptor, um crédito é retornado ao remetente para aquele
buffer. Desse modo, o receptor controla o ritmo no qual os dados são transmitidos sobre uma ligação de QPI.
Ocasionalmente, um bit transmitido por uma camada física é mudado durante a transmissão, por conta do
ruído ou de algum outro fenômeno.A função de controle de erro em uma camada de ligação detecta e recupera
a partir desses erros de bits, e então isola camadas mais altas a partir da experiência de erros de bits. O procedimento funciona da seguinte maneira para um fluxo de dados a partir do sistema A ao sistema B:
1. Como mencionado, cada flit de 80 bits inclui um campo de CR de 8 bits. O CRC é uma função de valor
do restante de 72 bits. Na transmissão, A calcula um valor de CRC para cada flit e insere o valor no flit.
2. Quando uma flit é recebida, B calcula um valor de CRC para corpo de 72 bits e compara o valor com o
valor de CRC recebido na flit. Se os dois valores de CRC não baterem, um erro terá sido detectado.
3. Quando B detecta um erro, ele envia um pedido a A para retransmitir uma flit que está com erro. Contudo,
por A poder ter tido crédito suficiente para enviar um stream de flits, de modo que flits adicionais tenham
sido transmitidas depois de uma flit com erro e antes de A receber um pedido de retransmissão, o pedido
é para A fazer backup e retransmitir a flit danificada, além de todas as flits subsequentes.
OPI - Camada de roteamento
A camada de roteamento é usada para determinar o caminho que um pacote vai trafegar através de interconexões disponíveis do sistema. Tabelas de rota são definidas por um firmware e descrevem os possíveis caminhos que um pacote pode seguir. Em pequenas configurações, como uma plataforma de duas ligações, as opções
de roteamento são limitadas e as tabelas de roteamento são bastante simples. Para sistemas maiores, as opções de
tabela de roteamento são mais complexas, dando a flexibilidade de roteamento e tráfego de rerroteamento,
dependendo de como (1) dispositivos são alocados na plataforma, (2) recursos do sistema são divididos e (3)
eventos de confiabilidade resultam no mapeamento em torno de um recurso de falha.
OPI - Camada de protocolo
Na camada, o pacote é definido como uma unidade de transferência. A definição de conteúdo de pacote é
padronizada com alguma flexibilidade permitida ao atender pedidos diferentes de segmentos de mercado. Uma
função-chave desempenhada nesse nível é um protocolo de coerência de cache, que age se certificando de que
os valores da memória principal mantidos em diversas caches são consistentes. Uma carga útil de pacote de
dados comum é um bloco de dados enviados para e a partir de uma cache.
PCI EXPRESS
O barramento PCI (do inglês, Peripheral Component lnterconnect) é um barramento de grande largura de banda, independente de processador,que pode funcionar como uma unidade intermediária ou barramento de periféricos. Em comparação com outras especificações de barramento comuns, a PCI oferece melhor desempenho de sistema para subsistemas de E/S de alta velocidade (por exemplo, adaptadores gráficos de vídeo, controladores de interface de rede, controladores de disco e assim por diante). A Intel começou a trabalhar na PCI em 1990, para seus sistemas baseados no Pentium e logo lançou todas as patentes ao domínio público, promovendo a criação de uma associação da indústria, a PCI Special Interest Group (PCI SIG), para desenvolver melhor e manter a compatibilidade das especificações da PCI. O resultado é que a PCI tem sido bastante adotada e está encontrando uso cada vez maior nos sistemas de computadores pessoais, estações de trabalho e servidores. Como a especificação é de domínio público e é adotada por grande parte da indústria de microprocessadores e periféricos, produtos PCI criados por diferentes fornecedores são compatíveis. Como no barramento de sistema discutido nas seções precedentes, o esquema de PCI baseado em barramento não tem sido apto para manter o ritmo com as demandas de taxa de dados dos dispositivos conectados. Portanto, uma nova versão, conhecida como PCI Express (PCle) foi desenvolvida. A PCle, como na QPI, é um esquema de interconexão ponto a ponto que visa substituir os esquemas baseados em barramento, como a PCI. O requisito-chave para o PCie é a alta capacidade de suportar as necessidades de dispositivos de E/S com taxas de dados mais altas, como a Giga bit Ethernet. Outro pedido diz respeito à necessidade de suportar streams de dados dependentes de tempo.Aplicações como vídeo sob demanda e redistribuição de áudio estão colocando restrições de tempo real também nos servidores. Algumas aplicações de comunicação e sistemas de controle com PC embarcado também processam dados em tempo real. As plataformas de hoje em dia devem também lidar com diversas transferências concorrentes em taxas sempre crescentes de dados. Não é mais aceitável tratar todos os dados com igualdade - é mais importante, por exemplo, processar os dados de streaming primeiro, desde que os últimos dados de tempo real sejam tão sem uso como se não tivessem informações. Os dados precisam ser etiquetados de modo que um sistema de E/S possa priorizar seu fluxo ao longo da plataforma.
PCI -Arquitetura física e lógica
A Figura mostra uma configuração comum que suporta o uso de PCie. Um dispositivo complexo root,
também conhecido como um chipset ou uma host bridge, conecta o processador e o subsistema da memória
ao dispositivo de comutação do PCI Express, compreendendo um ou mais PCie e dispositivos de comutação
PCie. O complexo root age como um dispositivo de buffering, para lidar com a diferença nas taxas de dados
entre os controladores E/S e a memória e os componentes do processador. O complexo root também converte
entre formatos de transação PCle e o sinal de processador e a memória e solicitações de controle. O chipset vai
geralmente apoiar as diversas portas PCle, algumas das quais se fixam diretamente ao dispositivo PCle, ou uma
ou mais que se fixam a um comutador que gerencia diversos streams de PCle. As ligações de PCie a partir do
chipset podem se fixar aos seguintes tipos de dispositivos que implementam a PCie:
► Comutador: o comutador gerencia diversos streams de PCie.
► Terminal de PCie: um dispositivo de E/S ou controlador que implementa a PCie, como um comutador de
ethernet Gigabit, um controlador de gráficos e vídeo, interface de disco ou um controlador de
comunicações.

► Terminal legado: a categoria de terminal legado visa aos projetos existentes que migraram para a PCI
Express, e isso permite comportamentos legado, como uso de espaço de E/Se transações bloqueadas.
Os terminais de PCI Express não têm permissão para solicitar o uso de espaço de E/S em um tempo de
execução e não devem usar transações bloqueadas. Ao distinguir essas categorias, não é possível para um
desenvolvedor de sistema restringir ou eliminar os comportamentos legado que têm impacto negativo na
robustez e no desempenho do sistema.
► Ponte PCle/PCI: permite que dispositivos antigos de PCI sejam conectados aos sistemas baseados em PCie.
Como na QPI, as interações de PCie são definidas usando uma arquitetura de protocolo. A arquitetura de
protocolo de PCie abrange as seguintes camadas:
► Física: consiste em fios reais que carregam os sinais, bem como circuitos e lógica para suportar os
requisitos para a transmissão e recepção de ls e Os.
► Ligação de dados: é responsável pela transmissão confiável e pelo controle de fluxo. Pacotes de dados
gerados e consumidos pela DLL são chamados de Pacotes de Camada de Ligação de Dados (DLLPs -
do inglês, Data Link Layer Packets).
► Transação: gera e consome pacotes de dados usados para implementar mecanismos de transferência de
dados de armazenamento de carga e também gerencia o controle de fluxo daqueles pacotes entre os dois
componentes em um link. Pacotes de dados gerados e consumidos pela TL são chamados de Pacotes de
Camada de Transação (TLPs - do inglês, Transaction Layer Packets).
Acima da TL estão camadas de software que geram pedidos de leitura e escrita que são transportados pela
camada de transação aos dispositivos de EIS usando protocolo de transação baseada em pacote.

PCie- Camada física
Semelhante à QPI, a PCie é uma arquitetura ponto a ponto. Cada porta de PCie consiste em um número
de vias bidirecionais ( observe que na QPI a via se refere à transferência em somente uma direção). A transferência em cada direção em uma via é feita por meio de sinalização diferencial sobre um par de fios. Uma porta
PCI pode proporcionar 1, 4, 6, 16 ou 32 vias. A seguir, referimo-nos à especificação PCie 3.0, lançada no final da
década de 2010.
Como na QPI, a PCie usa uma técnica de distribuição multi via. A Figura mostra um exemplo para uma
porta PCie, consistindo em quatro vias. Os dados são distribuídos pelas quatro vias 1 byte por vez, usando um
esquema round robin simples. Em cada via física,os dados são bufferizados e processados em 16 bytes (128 bits)
por vez. Cada bloco de 128 bits é codificado em uma única palavra de código de 130 bits para transmissão; isso
é conhecido como codificação de 128b/130b. Desse modo, uma taxa de dados efetiva de uma via individual é
reduzida pelo fator de 128/130.
Para entender a razão para a codificação de 128b/130b, observe que, ao contrário da QPI, a PCie não usa a
linha de clock para sincronizar o stream de bits. Ou seja, a linha de clock não é usada para determinar o começo
e o término de cada novo bit; é usada somente para outros propósitos de sinalização. Contudo, é necessário que
o receptor seja sincronizado com o transmissor, de modo que o receptor saiba quando cada bit começa e termina. Se houver algum desvio entre os clocks usados para a transmissão de bits e recepção do transmissor e receptor, podem ocorrer erros. Para compensar a possibilidade de desvio, a PCie faz a sincronização do receptor
com o transmissor, basedo no sinal transmitido. Como na QPI, a PCie usa sinalização diferenciada sobre um par
de fios.
A sincronização pode ser adquirida por um receptor que busque transições nos dados e que sincronize
seu clock à transição. Contudo, considere que com uma longa cadeia de ls ou Os usando uma sinalização diferenciada, a saída é uma tensão constante sobre um longo período de tempo. Sob essas circunstâncias, qualquer
diferença entre os clocks do transmissor e do receptor resultará em perda da sincronização entre
ambos.

Uma técnica comum, e a única usada na PCie 3.0, para superar o problema de uma longa cadeia de bits de
um valor é a cifragem. A cifragem, que não aumenta o número de bits a serem transmitidos, é uma técnica
de mapeamento que tende a fazer os dados aparecerem de modo mais aleatório. A cifragem tende a distribuir
o número de transições de modo que apareçam no receptor espaçadas de modo mais uniforme, o que é bom
para a sincronização. Além disso, outras propriedades de transmissão, como propriedades de espectro, são melhoradas se os dados forem mais próximos aleatoriamente do que constantes e repetitivos. Para mais discussão
sobre cifragem, veja o Apêndice E ( disponível em inglês na Sala Virtual).
Outra técnica que pode auxiliar na sincronização é a codificação, em que bits adicionais são inseridos no
stream de bits para forçar transições. Para a PCie 3.0, cada grupo de 128 bits de entrada é mapeado no bloco de
130 bits ao adicionar cabeçalho de sincronização de blocos. O valor de cabeçalho é 10 para bloco de dados e 01
para o que é chamado de bloco de conjunto solicitado, que se refere ao bloco de informação em nível de Ligação.
A Figura 3.24 ilustra o uso da cifragem e da codificação. Os dados a serem transmitidos são supridos em
um cifrador. A saída cifrada é, então, suprida em um codificador de 128b/130b, que bufferiza 128 bits e, então,
mapeia o bloco de 128 bits em um bloco de 130 bits. Esse bloco, então, passa através de um conversor paralelo
-série e transmite um bit por vez usando a sinalização diferenciada.
No receptor, um clock é sincronizado aos novos dados para recuperar o stream de bits. Então, passa pelo
conversor de série-paralelo para produzir um stream de blocos de 130 bit. Cada bloco é passado por um decodificador de 128b/130b para recuperar o padrão de bits cifrados original, que é, então, decodificado para produzir
o stream de bit original.
Ao usar essas técnicas, a taxa de dados de 16 GB/s pode ser atingida. Um detalhe final deve ser mencionado: cada transmissão de um bloco de dados sobre uma ligação de PCI começa e termina com uma sequência
de estrutura de 8 bits para dar ao receptor tempo para sincronizar com a nova stream de bits da
camada física.

PCle - Camada de transação
A camada de transação (TL) recebe pedidos de leitura e escrita a partir do software acima da TL e
cria pacotes de sol.icitação de transmissão para um destino por meio da camada de ligação. A maioria das
transações usa uma técnica de transação dividida, que funciona da seguinte maneira. Um pacote solicitado é
enviado por um dispositivo de PCie fonte, que então espera por uma resposta, chamada de pacote de realização. A realização seguida de um pedido é iniciada pelo realizador somente quando tem dados e/ou estado
"pronto para entrega'; Cada pacote tem um único identificador, que possibilita que os pacotes de realização
sejam d.irecionados ao originador de correção. Com a técnica de transação dividida, a realização é separada
em tempo a partir do pedido, ao contrário de uma operação de barramento comum, na qual ambos os lados
de uma transação devem estar disponíveis para pegar e usar o barramento. Entre o pedido e a realização,
outro tráfego de PCie pode usar a ligação.
As mensagens da TL e algumas transações de escrita são transações postadas, significando que não se espera resposta.
O formato de pacote da TL suporta endereçamento de memória de 32 bits e endereçamento de memória
estendida de 64 bits. Os pacotes também têm atributos como "não espiar';"pedidoflexibilizado" e "prioridade';
que podem ser usados para rotear de modo ideal esses pacotes por meio do subsistema de EIS.
ESPAÇOS ENDEREÇADOS E TIPOS DE TRANSAÇÃO A TL suporta quatro espaços endereçados:
► Memória: o espaço da memória inclui memória principal de sistema. Isso inclui dispositivos de EIS da
PCie. Alguns intervalos de endereçamento de memória são mapeados nos dispositivos de EIS.
► EIS: esse espaço de endereço é usado para dispositivos de PCI legado, com intervalos de endereços de
memória reservados para endereçar os dispositivos de EIS legado.
► Configuração: esse espaço de endereço possibilita que a TL leia/escreva registros de configuração associados aos
dispositivos de EIS.
► Mensagem: esse espaço de endereço é para sinais de controle relacionados a interrupções, manuseio de
erro e gerenciamento de potência.
A Tabela mostra os tipos de transação fornecidos pela TL. Para espaços de endereço de memória, EIS e
configuração, há transações de leitura e escrita. No caso de transações de memória, há também uma função de
solicitação de bloqueio de leitura. As operações bloqueadas ocorrem como o resultado de condutores de dispositivo que solicitam acesso atômico a registradores em um dispositivo de PCie. Um condutor de dispositivo, por
exemplo, pode ler, modificar e, então, ler atomicamente um registro de dispositivo. Para cumprir isso, o condutor do dispositivo faz que o processador execute uma instrução ou um conjunto de instruções. O complexo root
converte essas instruções de processador em uma sequência de transações de PCie, que realiza leitura individual e pedidos de escrita para o driver do dispositivo. Se as transações podem ser executadas atomicamente, o
complexo root bloqueia a ligação de PCie enquanto executa as transações. Esse bloqueio previne que ocorram
transações que não são parte da sequência.
Essa sequência de transações é chamada de operação bloqueada.
Um conjunto de instruções de processador particular que pode causar uma operação bloqueada depende do
chip set do sistema e da arquitetura do processador.


Para manter a compatibilidade com a PCI, a PCie suporta tanto os ciclos de configuração do tipo 1 como
do tipo 2. O ciclo do tipo 1 propaga na direção oposta ao complexo root, até atingir a interface da ponte que
hospeda o barramento (ligação) em que o dispositivo visado reside. A transação de configuração é convertida
na ligação de destino a partir do tipo O da ponte.
Por fim, as mensagens de realização são usadas com transações divididas para memória, EIS e transações
de configuração.
MONTAGEM DE PACOTE TLP
As transações de PCie são transmitidas usando pacotes de camadas de transação que são ilustrados na Figura 3.25a. Um TLP origina-se na camada de transação do dispositivo de envio e termina na camada de transação do dispositivo de recebimento. O software de camada superior envia à TL a informação necessária para que ela crie o core do TLP, que consiste nos seguintes campos:
► Cabeçalho: o cabeçalho descreve o tipo de pacote e inclui a informação necessária para que o receptor processe o pacote, inclusive quando for preciso uma informação de roteamento. O formato de cabeçalho interno é discutido posteriormente.
► Dados: um campo de dados de até 4096 bytes pode ser incluído no TLP. Alguns TLPs não contêm um campo de dados.
► ECRC: um campo opcional de CRC ponta a ponta possibilita que a camada de destino TL verifique os erros no cabeçalho e as partes de dados de TLP.
PCle - Camada de ligação de dados
O propósito da camada de ligação de dados PCie é assegurar a entrega confiável pela ligação de PCie. A DLL participa na formação de TLPs e também transmite DLLPs.
PACOTES DE CAMADA DE LIGAÇÃO DE DADOS
Os pacotes de camada de ligação de dados originam-se na camada de ligação de dados de um dispositivo de transmissão e terminam na DLL do dispositivo no outro final da ligação. A Figura mostra o formato do DLLP. Há três grupos importantes de DLLPs usados para gerenciar a ligação: pacotes de controle de fluxo, pacotes de gerenciamento de potência e pacotes TLP ACK e NAK. Os pacotes de gerenciamento de potência são usados no gerenciamento no planejamento da plataforma de energia. Os pacotes de controle de fluxo regulam a taxa em que TLPs e DLLPs podem ser transmitidas pelas ligações. Os pacotes de ACK e NAK são usados no processamento de TLP, que será discutido a seguir.
PACOTES DE CAMADA DE LIGAÇÃO DE DADOS
adiciona dois campos ao core do TLP, criado pela TL um número de sequência de 16 bits e um CRC de 32 bits da camada de ligação (LCRC). Enquanto os campos do core criados na TL são somente usados na TL de destino, os dois campos adicionados pela DLL são processados em cada nó intermediário na via a partir da fonte ao destino. Quando um TLP chega ao dispositivo, a DLL descobre o número de sequência e os campos de LCRC, além de verificar a LCRC. Existem duas possibilidades: 1. Se não forem detectados erros, a parte do core do TLP é levada até a camada de transação local. Se esse dispositivo de recebimento for o destino pretendido, então a TL processa o TLP. Por sua vez, a TL determina uma rota para o TLP e a retorna para a DLL para transmissão durante a próxima ligação na via ao destino. 2. Se um erro for detectado, a DLL programa um pacote de NAK DLL para retornar ao transmissor remoto. OTLP é eliminado. Quando a DLL transmite um TLP, ela retém uma cópia do TLP. Se recebe NAK para TLP com esse número de sequência, retransmite o TLP. Quando recebe ACK, descarta o TLP bufferizado.