Acesso direto à memória - Direct memory access

O acesso direto à memória ( DMA ) é um recurso dos sistemas de computador que permite que certos subsistemas de hardware acessem a memória do sistema principal ( memória de acesso aleatório ) independentemente da unidade de processamento central (CPU).

Sem DMA, quando a CPU está usando a entrada / saída programada , ela normalmente fica totalmente ocupada por toda a duração da operação de leitura ou gravação e, portanto, não está disponível para realizar outro trabalho. Com o DMA, a CPU primeiro inicia a transferência, depois faz outras operações enquanto a transferência está em andamento e, finalmente, recebe uma interrupção do controlador DMA (DMAC) quando a operação é concluída. Este recurso é útil em qualquer momento em que a CPU não consegue acompanhar a taxa de transferência de dados ou quando a CPU precisa realizar um trabalho enquanto espera por uma transferência de dados de E / S relativamente lenta. Muitos sistemas de hardware usam DMA, incluindo controladores de unidade de disco , placas gráficas , placas de rede e placas de som . O DMA também é usado para transferência de dados intra-chip em processadores multi-core . Os computadores que têm canais DMA podem transferir dados de e para dispositivos com muito menos sobrecarga de CPU do que computadores sem canais DMA. Da mesma forma, um elemento de processamento dentro de um processador multi-core pode transferir dados de e para sua memória local sem ocupar o tempo do processador, permitindo que a computação e a transferência de dados prossigam em paralelo.

O DMA também pode ser usado para copiar ou mover dados de "memória para memória" na memória. O DMA pode descarregar operações caras de memória, como cópias grandes ou operações de coleta dispersa , da CPU para um mecanismo DMA dedicado. Um exemplo de implementação é o / O Acceleration I Tecnologia . O DMA tem interesse em arquiteturas de computação em rede e em memória .

Princípios

Terceiro

Placa-mãe de um computador NeXTcube (1990). Os dois grandes circuitos integrados abaixo do meio da imagem são o controlador DMA (l.) E - incomum - um controlador DMA dedicado extra (r.) Para o disco magneto-óptico usado em vez de uma unidade de disco rígido na primeira série de este modelo de computador.

O DMA padrão, também chamado de DMA de terceiros, usa um controlador DMA. Um controlador DMA pode gerar endereços de memória e iniciar ciclos de leitura ou gravação de memória. Ele contém vários registros de hardware que podem ser escritos e lidos pela CPU. Isso inclui um registro de endereço de memória, um registro de contagem de bytes e um ou mais registros de controle. Dependendo de quais recursos o controlador DMA fornece, esses registros de controle podem especificar alguma combinação da fonte, o destino, a direção da transferência (leitura do dispositivo de E / S ou gravação no dispositivo de E / S), o tamanho do unidade de transferência e / ou o número de bytes a serem transferidos em um burst.

Para realizar uma operação de entrada, saída ou memória para memória, o processador host inicializa o controlador DMA com uma contagem do número de palavras a serem transferidas e o endereço de memória a serem usados. A CPU então comanda o dispositivo periférico para iniciar uma transferência de dados. O controlador DMA então fornece endereços e linhas de controle de leitura / gravação para a memória do sistema. Cada vez que um byte de dados está pronto para ser transferido entre o dispositivo periférico e a memória, o controlador DMA incrementa seu registro de endereço interno até que o bloco completo de dados seja transferido.

Controle de ônibus

Em um sistema de barramento mestre , também conhecido como sistema DMA original, a CPU e os periféricos podem ter o controle do barramento de memória. Onde um periférico pode se tornar um barramento mestre, ele pode escrever diretamente na memória do sistema sem o envolvimento da CPU, fornecendo endereço de memória e sinais de controle conforme necessário. Algumas medidas devem ser fornecidas para colocar o processador em uma condição de espera para que a contenção do barramento não ocorra.

Modos de operação

Modo burst

No modo burst , um bloco inteiro de dados é transferido em uma sequência contígua. Depois que o controlador DMA recebe acesso ao barramento do sistema pela CPU, ele transfere todos os bytes de dados no bloco de dados antes de liberar o controle dos barramentos do sistema de volta para a CPU, mas torna a CPU inativa por períodos relativamente longos de tempo. O modo também é denominado "Modo de transferência em bloco".

Modo de roubo de ciclo

O modo de roubo de ciclo é usado em sistemas nos quais a CPU não deve ser desabilitada pelo período de tempo necessário para os modos de transferência em rajada. No modo de roubo de ciclo, o controlador DMA obtém acesso ao barramento do sistema da mesma forma que no modo burst, usando os sinais BR ( Bus Request ) e BG ( Bus Grant ) , que são os dois sinais que controlam a interface entre a CPU e o Controlador DMA. No entanto, no modo de roubo de ciclo, após um byte de transferência de dados, o controle do barramento do sistema é desativado para a CPU via BG. Em seguida, é continuamente solicitado novamente via BR, transferindo um byte de dados por solicitação, até que todo o bloco de dados seja transferido. Ao obter e liberar continuamente o controle do barramento do sistema, o controlador DMA essencialmente intercala as transferências de instruções e dados. A CPU processa uma instrução, então o controlador DMA transfere um valor de dados e assim por diante. Os dados não são transferidos tão rapidamente, mas a CPU não fica ociosa por tanto tempo quanto no modo burst. O modo de roubo de ciclo é útil para controladores que monitoram dados em tempo real.

Modo transparente

O modo transparente leva mais tempo para transferir um bloco de dados, mas também é o modo mais eficiente em termos de desempenho geral do sistema. No modo transparente, o controlador DMA transfere dados apenas quando a CPU está realizando operações que não usam os barramentos do sistema. A principal vantagem do modo transparente é que a CPU nunca para de executar seus programas e a transferência DMA é gratuita em termos de tempo, enquanto a desvantagem é que o hardware precisa determinar quando a CPU não está usando os barramentos do sistema, que podem ser complexos . Isso também é chamado de " modo de transferência de dados DMA oculto ".

Coerência de cache

Incoerência de cache devido a DMA

O DMA pode levar a problemas de coerência do cache . Imagine uma CPU equipada com um cache e uma memória externa que pode ser acessada diretamente por dispositivos usando DMA. Quando a CPU acessa a localização X na memória, o valor atual é armazenado no cache. As operações subsequentes no X atualizarão a cópia em cache do X, mas não a versão da memória externa do X, assumindo um cache de write-back . Se o cache não for liberado para a memória antes da próxima vez que um dispositivo tentar acessar X, o dispositivo receberá um valor obsoleto de X.

Da mesma forma, se a cópia em cache de X não for invalidada quando um dispositivo gravar um novo valor na memória, a CPU operará com um valor obsoleto de X.

Esse problema pode ser resolvido de uma das duas maneiras no design do sistema: Os sistemas coerentes com cache implementam um método no hardware, chamado bus snooping , por meio do qual as gravações externas são sinalizadas para o controlador de cache, que executa uma invalidação de cache para gravações DMA ou liberação de cache para DMA lê. Os sistemas não coerentes deixam isso para o software, onde o sistema operacional deve então garantir que as linhas de cache sejam liberadas antes que uma transferência DMA de saída seja iniciada e invalidada antes que um intervalo de memória afetado por uma transferência DMA de entrada seja acessado. O sistema operacional deve certificar-se de que o intervalo de memória não seja acessado por nenhum thread em execução nesse ínterim. A última abordagem introduz alguma sobrecarga para a operação de DMA, já que a maioria do hardware requer um loop para invalidar cada linha de cache individualmente.

Também existem híbridos, onde o cache L2 secundário é coerente enquanto o cache L1 (normalmente na CPU) é gerenciado por software.

Exemplos

É UM

No IBM PC original (e no subsequente PC / XT ), havia apenas um controlador Intel 8237 DMA capaz de fornecer quatro canais DMA (numerados de 0 a 3). Esses canais de DMA realizavam transferências de 8 bits (já que o 8237 era um dispositivo de 8 bits, idealmente combinado com a arquitetura de CPU / barramento i8088 do PC ), só conseguia lidar com o primeiro megabyte de RAM ( padrão i8086 / 8088) e eram limitados para endereçar segmentos únicos de 64  kB dentro desse espaço (embora os canais de origem e destino possam endereçar segmentos diferentes). Além disso, o controlador só pode ser usado para transferências para, de ou entre dispositivos de E / S de barramento de expansão, já que o 8237 só pode realizar transferências de memória para memória usando os canais 0 e 1, dos quais o canal 0 no PC (& XT ) foi dedicado à atualização dinâmica da memória . Isso evitou que fosse usado como um " Blitter " de uso geral e, conseqüentemente, os movimentos de bloco de memória no PC, limitados pela velocidade PIO geral da CPU, eram muito lentos.

Com o IBM PC / AT , o barramento AT aprimorado (mais conhecido como ISA , ou "Industry Standard Architecture") adicionou um segundo controlador 8237 DMA para fornecer três adicionais, e conforme destacado por conflitos de recursos com a capacidade de expansão adicional do XT sobre o PC original, canais muito necessários (5–7; o canal 4 é usado como uma cascata para o primeiro 8237). O registro de página também foi reconectado para endereçar todo o espaço de endereço de memória de 16 MB da CPU 80286. Este segundo controlador também foi integrado de uma forma capaz de realizar transferências de 16 bits quando um dispositivo de E / S é usado como fonte de dados e / ou destino (na verdade, ele só processa os próprios dados para transferências de memória para memória, caso contrário, simplesmente controlar o fluxo de dados entre outras partes do sistema de 16 bits, tornando sua própria largura de barramento de dados relativamente imaterial), dobrando a taxa de transferência de dados quando os três canais superiores são usados. Para compatibilidade, os quatro canais DMA inferiores ainda estavam limitados a apenas transferências de 8 bits e, embora as transferências de memória para memória fossem agora tecnicamente possíveis devido à liberação do canal 0 de ter que lidar com atualização de DRAM, de um ponto de vista prático eles foram de valor limitado por causa do consequente baixo rendimento do controlador em comparação com o que a CPU poderia alcançar agora (ou seja, um 80286 de 16 bits mais otimizado rodando a um mínimo de 6 MHz, vs um controlador de 8 bits travado em 4,77 MHz). Em ambos os casos, o problema de limite do segmento de 64 kB permaneceu, com as transferências individuais incapazes de cruzar os segmentos (em vez de "envolver" o início do mesmo segmento), mesmo no modo de 16 bits, embora isso fosse na prática mais um problema de programação complexidade do que o desempenho, já que a necessidade contínua de atualização de DRAM (independentemente de como for tratada) para monopolizar o barramento a aproximadamente cada 15  μs evitou o uso de grandes (e rápidas, mas ininterruptas) transferências de bloco.

Devido ao seu desempenho de atraso ( capacidade de transferência máxima de 8 bits de 1,6  MB / s a ​​5 MHz, mas não mais do que 0,9 MB / s no PC / XT e 1,6 MB / s para transferências de 16 bits no AT devido ao barramento ISA sobrecargas e outras interferências, como interrupções de atualização de memória) e indisponibilidade de qualquer grau de velocidade que permitiria a instalação de substitutos diretos operando em velocidades mais altas do que o clock padrão de 4,77 MHz do PC original, esses dispositivos tornaram-se obsoletos desde o final dos anos 1980. Particularmente, o advento do processador 80386 em 1985 e sua capacidade para transferências de 32 bits (embora grandes melhorias na eficiência do cálculo de endereço e movimentos de memória de bloco em CPUs Intel após o 80186 significou que PIO transfere até mesmo pelo barramento de 16 bits 286 e 386SX ainda poderiam facilmente superar o 8237), bem como o desenvolvimento de novas evoluções para ( EISA ) ou substituições para ( MCA , VLB e PCI ) o barramento "ISA" com seus próprios subsistemas DMA de desempenho muito superior (até um máximo de 33 MB / s para EISA, 40 MB / s MCA, tipicamente 133 MB / s VLB / PCI) fez com que os controladores DMA originais parecessem mais uma pedra de desempenho do que um impulsionador. Eles foram suportados na medida em que são necessários para suportar hardware de PC legado integrado em máquinas posteriores. As peças de hardware legado que continuaram a usar ISA DMA depois que os barramentos de expansão de 32 bits se tornaram comuns foram as placas Sound Blaster que precisavam manter compatibilidade total de hardware com o padrão Sound Blaster; e dispositivos Super I / O em placas-mãe que geralmente integram um controlador de disquete embutido , um controlador de infravermelho IrDA quando o modo FIR (infravermelho rápido) é selecionado e um controlador de porta paralela IEEE 1284 quando o modo ECP é selecionado. Nos casos em que um 8237s original ou compatível direto ainda foi usado, a transferência de ou para esses dispositivos ainda pode ser limitada aos primeiros 16 MB de RAM principal, independentemente do espaço de endereço real do sistema ou da quantidade de memória instalada.

Cada canal DMA possui um registro de endereço de 16 bits e um registro de contagem de 16 bits associado a ele. Para iniciar uma transferência de dados, o driver de dispositivo configura o endereço do canal DMA e os registradores de contagem junto com a direção da transferência de dados, leitura ou gravação. Em seguida, ele instrui o hardware DMA a iniciar a transferência. Quando a transferência é concluída, o dispositivo interrompe a CPU.

O DMA de E / S vetorizado ou disperso permite a transferência de dados de e para áreas de memória múltiplas em uma única transação DMA. É equivalente ao encadeamento de várias solicitações DMA simples. A motivação é descarregar múltiplas interrupções de entrada / saída e tarefas de cópia de dados da CPU.

DRQ significa solicitação de dados ; DACK para reconhecimento de dados . Esses símbolos, vistos em esquemas de hardware de sistemas de computador com funcionalidade DMA, representam linhas de sinalização eletrônica entre a CPU e o controlador DMA. Cada canal DMA tem uma linha de solicitação e uma linha de reconhecimento. Um dispositivo que usa DMA deve ser configurado para usar ambas as linhas do canal DMA atribuído.

O ISA de 16 bits permite o barramento master.

Atribuições padrão ISA DMA:

  1. Atualização de DRAM (obsoleto),
  2. Hardware do usuário, geralmente placa de som DMA de 8 bits
  3. Controlador de disquete ,
  4. Disco rígido (obsoleto pelos modos PIO e substituído pelos modos UDMA ), porta paralela (porta compatível com ECP), alguns clones SoundBlaster como o OPTi 928.
  5. Cascata para o controlador PC / XT DMA,
  6. Disco rígido ( PS / 2 apenas), hardware do usuário para todos os outros, geralmente placa de som DMA de 16 bits
  7. Hardware do usuário.
  8. Hardware do usuário.

PCI

Uma arquitetura PCI não possui controlador DMA central, ao contrário do ISA. Em vez disso, qualquer dispositivo PCI pode solicitar o controle do barramento ("tornar-se o mestre do barramento ") e solicitar a leitura e gravação na memória do sistema. Mais precisamente, um componente PCI solicita propriedade de barramento do controlador de barramento PCI (geralmente ponte de host PCI e ponte PCI para PCI), que irá arbitrar se vários dispositivos solicitarem propriedade de barramento simultaneamente, uma vez que só pode haver um mestre de barramento por vez. Quando for concedida a propriedade ao componente, ele emitirá comandos normais de leitura e gravação no barramento PCI, que serão solicitados pelo controlador do barramento PCI.

Por exemplo, em um PC baseado em AMD Socket AM2 , o southbridge irá encaminhar as transações para o controlador de memória (que está integrado no chip da CPU) usando HyperTransport , que por sua vez irá convertê-las para operações DDR2 e enviá-las para o Barramento de memória DDR2. Como resultado, há várias etapas envolvidas em uma transferência PCI DMA; no entanto, isso representa pouco problema, uma vez que o dispositivo PCI ou o barramento PCI em si são uma ordem de magnitude mais lentos do que o resto dos componentes (consulte a lista de larguras de banda do dispositivo ).

Uma CPU x86 moderna pode usar mais de 4 GB de memória, utilizando Physical Address Extension (PAE), um modo de endereçamento de 36 bits ou o modo nativo de 64 bits de CPUs x86-64 . Nesse caso, um dispositivo que usa DMA com um barramento de endereço de 32 bits é incapaz de endereçar memória acima da linha de 4 GB. O novo mecanismo Double Address Cycle (DAC), se implementado no barramento PCI e no próprio dispositivo, permite o endereçamento DMA de 64 bits. Caso contrário, o sistema operacional precisaria contornar o problema usando buffers duplos caros (nomenclatura DOS / Windows), também conhecidos como buffers de rejeição ( FreeBSD / Linux), ou poderia usar um IOMMU para fornecer serviços de tradução de endereços, se houver .

I / OAT

Como um exemplo de mecanismo DMA incorporado em uma CPU de uso geral, alguns chipsets Intel Xeon incluem um mecanismo DMA chamado I / O Acceleration Technology (I / OAT), que pode descarregar a cópia de memória da CPU principal, liberando-a para fazer outro trabalho . Em 2006, o desenvolvedor de kernel do Linux da Intel, Andrew Grover, realizou benchmarks usando I / OAT para descarregar cópias de tráfego de rede e não encontrou mais de 10% de melhoria na utilização da CPU com o recebimento de cargas de trabalho.

DDIO

Outros aprimoramentos orientados ao desempenho para o mecanismo DMA foram introduzidos nos processadores Intel Xeon E5 com seu recurso Data Direct I / O ( DDIO ), permitindo que as "janelas" DMA residam nos caches da CPU em vez da RAM do sistema. Como resultado, os caches de CPU são usados ​​como fonte primária e destino para E / S, permitindo que controladores de interface de rede (NICs) façam DMA diretamente para o cache de último nível (cache L3) de CPUs locais e evitem a obtenção cara de E / S dados da RAM do sistema. Como resultado, o DDIO reduz a latência geral de processamento de I / O, permite que o processamento de I / O seja realizado inteiramente em cache, evita que a largura de banda / latência de RAM disponível se torne um gargalo de desempenho e pode reduzir o consumo de energia, permitindo RAM para permanecer mais tempo em estado de baixa potência.

AHB

Em sistemas em um chip e em sistemas embarcados , a infraestrutura típica de barramento de sistema é um barramento em chip complexo, como o barramento de alto desempenho AMBA . AMBA define dois tipos de componentes AHB: mestre e escravo. Uma interface escrava é semelhante à E / S programada por meio da qual o software (rodando em CPU embutida, por exemplo, ARM ) pode escrever / ler registros de E / S ou (menos comumente) blocos de memória local dentro do dispositivo. Uma interface mestre pode ser usada pelo dispositivo para realizar transações DMA de / para a memória do sistema sem carregar muito a CPU.

Portanto, dispositivos de alta largura de banda, como controladores de rede, que precisam transferir grandes quantidades de dados de / para a memória do sistema, terão dois adaptadores de interface para o AHB: uma interface mestre e uma interface escrava. Isso ocorre porque os barramentos on-chip, como AHB, não suportam o tri-estado do barramento ou a alternância da direção de qualquer linha no barramento. Como o PCI, nenhum controlador DMA central é necessário, uma vez que o DMA é bus-mastering, mas um árbitro é necessário no caso de múltiplos mestres presentes no sistema.

Internamente, um mecanismo DMA multicanal está geralmente presente no dispositivo para executar várias operações de coleta de dispersão simultâneas conforme programado pelo software.

Célula

Como um exemplo de uso de DMA em um sistema multiprocessador no chip , o processador Cell da IBM / Sony / Toshiba incorpora um mecanismo de DMA para cada um de seus 9 elementos de processamento, incluindo um elemento de processador de energia (PPE) e oito elementos de processador sinérgico (SPEs) . Uma vez que as instruções de carregamento / armazenamento do SPE podem ler / gravar apenas sua própria memória local, um SPE depende inteiramente de DMAs para transferir dados de e para a memória principal e memórias locais de outros SPEs. Assim, o DMA atua como um meio primário de transferência de dados entre os núcleos dentro desta CPU (em contraste com as arquiteturas CMP coerentes com o cache, como a GPU de propósito geral cancelada da Intel , Larrabee ).

O DMA na célula é totalmente coerente com o cache (observe, no entanto, os armazenamentos locais de SPEs operados pelo DMA não agem como um cache globalmente coerente no sentido padrão ). Em ambos read ("get") e write ("put"), um comando DMA pode transferir uma área de bloco único de tamanho de até 16 KB ou uma lista de 2 a 2048 desses blocos. O comando DMA é emitido especificando um par de um endereço local e um endereço remoto: por exemplo, quando um programa SPE emite um comando put DMA, ele especifica um endereço de sua própria memória local como a fonte e um endereço de memória virtual (apontando para a memória principal ou a memória local de outro SPE) como destino, junto com um tamanho de bloco. De acordo com um experimento, um desempenho de pico efetivo de DMA na célula (3 GHz, sob tráfego uniforme) chega a 200 GB por segundo.

Pipelining

Processadores com memória scratchpad e DMA (como processadores de sinais digitais e o processador Cell ) podem se beneficiar das operações de memória DMA de sobreposição de software com processamento, por meio de buffer duplo ou multibuffering. Por exemplo, a memória no chip é dividida em dois buffers; o processador pode estar operando com dados em um, enquanto o mecanismo DMA está carregando e armazenando dados no outro. Isso permite que o sistema evite a latência da memória e explore as transferências de burst , ao custo de precisar de um padrão de acesso à memória previsível .

Veja também

Notas

Referências

links externos