Tenho uma pergunta bastante direta, mas não consegui encontrar uma resposta para ela em nenhum lugar.
Em um sistema Von-Neumann em que código e dados residem na mesma RAM, a CPU deve buscar todas as instruções na memória. Agora, para mover grandes quantidades de dados entre os componentes do computador, existe um controlador de acesso direto à memória que permite que os periféricos tenham acesso à RAM do sistema principal.
Minha pergunta é a seguinte: se o DMA está permitindo uma transferência de dados (possivelmente muito longa) entre, digamos, o disco rígido e a RAM, isso não significa que a CPU não pode usar RAM e, portanto, não pode buscar sua próxima instrução?
Em resumo, o DMA deve substituir o processador, arbitrando todas as leituras e gravações de E / S, a fim de liberar o processador para fazer outras coisas. No entanto, se não puder buscar suas instruções na RAM, não será liberado de qualquer maneira.
Há alguns detalhes que estou perdendo aqui?
obrigado
fonte
Respostas:
Você está certo de que a CPU não pode acessar a memória durante uma transferência DMA. No entanto, existem dois fatores que, combinados, permitem o acesso aparente à memória paralela pela CPU e pelo dispositivo que realiza a transferência do DMA:
mov
instrução com operando indireto).Em conjunto, esses dois fatores significam que o dispositivo que realiza a transferência de DMA terá pouco impacto na velocidade da CPU.
EDIT: Esqueci de mencionar que também há o fator de cache da CPU, que, enquanto o código que a CPU está executando estiver no cache, ele não precisará acessar a memória real para buscar instruções, portanto, uma transferência de DMA não será para atrapalhar (embora se a instrução precisar acessar a memória, obviamente ocorrerá um acesso real à memória - potencialmente, será necessário aguardar uma pausa no uso da memória do dispositivo DMA).
fonte
Se houver uma única interface de memória, haveria hardware para arbitrar entre solicitações. Normalmente, um processador teria prioridade sobre a E / S sem passar por E / S, mas mesmo com a E / S sempre tendo prioridade, o processador teria algumas oportunidades para acessar a memória porque a E / S tende a ter demandas de largura de banda mais baixas e a ser intermitente.
Além disso, normalmente há mais de uma interface para a memória. Processadores com desempenho mais alto geralmente têm caches (se o DMA não é coerente, os caches nem precisam ser espionados; mesmo com espião, a sobrecarga geralmente seria pequena por causa da diferença de largura de banda entre o cache e a memória principal ou (quando o DMA é transferido para L3 cache) entre o cache L3 e o cache L1), fornecendo uma interface separada para acessar a memória. Os microcontroladores geralmente acessam as instruções de uma memória separada baseada em flash, permitindo que a busca prossiga durante o DMA para a memória no chip, e geralmente possuem memória fortemente acoplada a uma interface independente (permitindo muitos acessos de dados para evitar conflitos de DMA).
Mesmo com uma única interface de memória, o pico da largura de banda geralmente será maior do que a largura de banda normalmente usada. (Para busca de instruções, mesmo um buffer pequeno com carregamento de memória maior que a média da memória permitiria a busca de instruções do buffer enquanto outro agente estiver usando a interface de memória, explorando a tendência do código de não ramificar.)
Observe também que, como um processador acessa dados, se houver uma única interface de memória, deve haver um mecanismo de arbitragem entre acessos a dados e acessos a instruções.
Se o processador (com uma única interface de memória) fosse forçado a implementar uma cópia de um buffer de dispositivo de E / S para a memória principal, ele também precisaria buscar instruções para executar a cópia. Isso pode significar dois acessos à memória por palavra transferida, mesmo em um ISA com operações de memória / memória (um ISA de armazenamento de carga pode exigir três acessos à memória ou mais se o endereçamento de memória pós-incremento não for fornecido); isto é, além do acesso de E / S, que em sistemas antigos pode compartilhar a mesma interface que a memória principal. Um mecanismo DMA não acessa instruções na memória e evita essa sobrecarga.
fonte
Como existe apenas um sistema de barramento, que é bloqueado pelo acesso à memória do DMA, a CPU não pode funcionar enquanto o DMA estiver movendo dados e, portanto, é interrompido.
A idéia por trás disso é a seguinte:
Se você deseja copiar dados consecutivos da memória, a CPU precisaria fazer algo assim:
Calcular endereço-> ler dados-> calcular novo endereço (+ 1 palavra) -> ler dados ...
Enquanto o DMA faz o cálculo do novo endereço em paralelo (dependendo do modo) e, portanto, é mais rápido. Portanto, o DMA pode funcionar com a capacidade total do barramento (teoricamente).
fonte
De um modo geral, não.
Na maioria das arquiteturas de sistema, todos os pedidos de acesso à memória têm uma prioridade atribuída a eles. Quando há mais solicitações simultâneas de memória do que o sistema pode atender por vez, as solicitações com prioridade mais alta são atendidas primeiro. Solicitações de memória iniciadas pela CPU geralmente recebem a maior prioridade possível.
fonte
Em geral não.
Alguns sistemas com certeza, apenas um mestre de cada vez. Um design um pouco mais antigo, se for esse o caso (mesmo os designs antigos costumavam ter soluções paralelas). Um tipo moderno de barramento através de cada barramento (endereço, gravação de dados, leitura de dados) opera independentemente e possui um tag ou ID por ciclo de clock para mostrar a qual transação esse ciclo de clock está associado. Assim, você pode ter muitas / muitas transações em andamento ao mesmo tempo nas duas direções, com diferentes transações embaralhadas juntas nos barramentos de leitura ou gravação de dados. Quem será o próximo seria baseado em prioridade, não há regra de que as transações no barramento precisem ser realizadas na ordem em que as instruções do software são definidas, o processador pode determinar que pode iniciar algumas antes das outras, e, naturalmente, as respostas voltarão em diferentes ordens, dependendo da proximidade e rapidez do alvo. Da mesma forma, as buscas não estão em ordem, a previsão de ramificação dispara buscas de aparência aleatória sempre que necessário.
Uma transação de dma grande exigiria muito mais largura de banda de barramento, mas dizer que o processador trava, não necessariamente o caso, também depende da arquitetura e do código. O código pode ter uma instrução que diz parar até que esse final do sinal / evento de transferência aconteça e, em seguida, garantir que o processador termine o que pode fazer no tubo e depois pare. Mas isso ou algumas arquiteturas podem não exigir que você pare, não é realmente sensato parar de qualquer maneira, com tanta largura de banda desperdiçada. Qual seria o sentido do dma de qualquer maneira, se ele não operar em paralelo, apenas codifique a transferência em um loop, as buscas adicionam alguns ciclos, talvez dependendo da arquitetura, que não são tão dispendiosos quanto a sobrecarga, a energia etc. da lógica do dma. O dma funciona para a arquitetura e o sistema específicos em que você está e decide se vale a pena usar,
Não existe uma resposta genérica para como o dma funciona, ele depende muito do design do sistema e de todos os componentes dentro do sistema.
fonte