Como o endereço físico é exibido nas cadeias e bancos de DRAM

Em um artigo anterior, discutimos como os processadores Intel Sandy Bridge mapeiam endereços físicos no cache L3.

Agora, mostrarei como os controladores de memória desses processadores mapeiam endereços físicos para um local na DRAM - em particular, os números de linha, banco e coluna nos módulos DRAM. Chame de mapeamento de endereço DRAM Eu uso uma máquina de teste como exemplo.

Motivação: Bug de Rowhammer


Estou interessado em mapear endereços DRAM, no que se refere a um bug do Rowhammer .

O Rowhammer é um problema em alguns módulos DRAM, em que certos modelos de acesso à memória dos piores casos podem levar à corrupção da memória. Nessas DRAMs, a ativação repetida de uma linha de memória ("entupimento de linha") causa ruído elétrico que altera os bits nas células vulneráveis ​​das linhas adjacentes.

Essas ativações de linha repetidas podem ser causadas pelo acesso múltiplo a um par de endereços DRAM que estão em linhas diferentes do mesmo banco DRAM. Conhecer o mapeamento de endereços DRAM é útil porque indica quais pares de endereços atendem a essa propriedade "um banco, linha diferente" (mesmo banco, linha diferente; SBDR).

Adivinhando e verificando o mapeamento de endereços


Para o teste, eu tenho uma máquina com módulos DRAM vulneráveis ​​ao bug Rowhammer. A execução de rowhammer_test nesta máquina mostra uma pequena alteração.

Gostaria de saber o esquema de mapeamento de endereço DRAM para esta máquina, mas não está documentado publicamente: aqui está o processador Sandy Bridge, mas a Intel não documenta o mapeamento de endereço usado pelos controladores de memória desses processadores.

De fato, o teste rowhammer_test não precisa conhecer pares de endereços SBDR. Ele apenas tenta várias vezes martelar em pares de endereços selecionados aleatoriamente. Geralmente 1/8 ou 1/16 deles são pares SBDR, porque em nosso carro existem 8 bancos em cada DIMM (e 16 bancos no total). Portanto, não precisamos conhecer o mapeamento de endereços DRAM para causar uma pequena alteração na memória, mas esse conhecimento ajudará a realizar o teste de maneira mais proposital.

Embora o mapeamento de endereços não esteja documentado, achei que poderia fazer uma suposição razoável sobre isso com base na geometria DRAM e, em seguida, verifique a suposição com base nos endereços físicos relatados por rowhammer_test . O teste relata os endereços físicos onde os bits mudam ( "vítimas" ) e os pares de endereços físicos que fazem essas alterações ( "agressores" ). Como esses pares devem ser pares SBDR, podemos verificar um mapeamento hipotético de endereços para esses dados empíricos.

Geometria da memória


A primeira etapa: verifique quantos DIMMs estão instalados na máquina e como eles estão organizados internamente.

Posso solicitar informações de DIMM usando a decode-dimms no Linux (no Ubuntu, está no pacote I2C-tools ). Essa ferramenta decodifica os metadados SPD (Serial Presence Detect) no DIMM.

Na minha máquina de teste, dois SO-DIMMs de quatro gigabytes, que fornecem 8 GB de memória.

A decode-dimms reporta as seguintes informações para cada um dos módulos:

  Tamanho 4096 MB
 Bancos x Linhas x Colunas x Bits 8 x 15 x 10 x 64
 Fileiras 2 

Isso significa que os dois DIMMs:

  • Cada banco possui 2 ^ 15 linhas (32768 linhas).
  • Cada linha contém 2 ^ 10 * 64 bits = 2 ^ 16 bits = 2 ^ 13 bytes = 8 KB.

Cada DIMM possui 2 fileiras e 8 bancos. A verificação cruzada da capacidade do DIMM fornece o tamanho esperado:

8 KB por linha * 32768 linhas * 2 classificações * 8 bancos = 4096 MB = 4 GB

Mapeando endereços DRAM


No meu computador de teste, bits de endereços físicos são usados ​​da seguinte maneira:

  • Bits 0-5 : esses são os 6 bits inferiores do índice de bytes na string (ou seja, o índice de 6 bits da linha de cache de 64 bytes).
  • Bit 6 : este é um número de canal de 1 bit que seleciona entre dois DIMMs.
  • Bits 7-13 : os 7 bits superiores do índice em uma linha (ou seja, os bits superiores do número da coluna).
  • Bits 14-16 : XOR com os 3 bits inferiores do número da linha, o que fornece um número bancário de 3 bits.
  • Bit 17 : Um número de classificação de 1 bit que seleciona entre duas classificações DIMM (que geralmente são os dois lados de um chip DIMM).
  • Bits 18-32 : número da linha de 15 bits.
  • Bits 33+ : eles podem ser configurados porque a memória física começa com endereços físicos maiores que 0.

Por que essa exibição?


Esse mapeamento é rowhammer_test aos resultados de rowhammer_test (veja abaixo), mas também podemos explicar que os bits de endereço são mapeados de maneira a fornecer um bom desempenho para padrões típicos de acesso à memória, como acesso sequencial e acesso por etapas ou etapas ( acesso restrito):

  • Canais de simultaneidade . A colocação de um número de canal no bit 6 significa que as linhas de cache serão alternadas entre dois canais (ou seja, dois DIMMs) que podem ser acessados ​​em paralelo. Isso significa que, se acessarmos os endereços sequencialmente, a carga será distribuída por dois canais.

    A propósito, Ivy Bridge (sucessora de Sandy Bridge) parece complicar a exibição do número do canal. A apresentação da Intel menciona "hash de canal" e afirma que "permite selecionar um canal com base em vários bits de endereço. Historicamente, era "A [6]". Isso garante uma distribuição mais uniforme do acesso à memória pelos canais. ”
  • Escorregamento bancário : em geral, a organização dos números das colunas, bancos e linhas deve minimizar a mudança frequente de linhas ativas do banco (debulha do banco).

    Uma pequena introdução: os módulos DRAM são organizados em bancos, que, por sua vez, são organizados em linhas. Cada banco possui uma “linha ativada atual”: seu conteúdo é copiado para o buffer da linha , que atua como um cache, que pode ser acessado rapidamente. O acesso a outra linha leva mais tempo, pois precisa ser ativado primeiro. Portanto, ao mapear endereços DRAM, os pares SBDR são transportados o mais longe possível no espaço de endereço físico.

    Linhas de perseguição (martelamento de linha) é um caso especial de escorregamento de um banco quando duas linhas específicas são ativadas alternadamente (possivelmente de propósito).
  • Paralelismo do banco : os bancos podem ser acessados ​​em paralelo (embora em menor grau que os canais), portanto o número do banco muda antes do número da linha à medida que o endereço aumenta.
  • Esquema XOR : XOR'introduzir os bits menos significativos de um número de linha em um número de banco é um truque para evitar escorregar no banco ao acessar matrizes em grandes etapas. Por exemplo, na exibição acima, XOR'ing força os endereços X e X + 256k a serem localizados em bancos diferentes, sem formar um par SBDR.

    Os esquemas de XOR para banco / linha são descritos em várias literaturas, por exemplo:

Reconciliação com rowhammer_test


A execução de rowhammer_test_ext (uma versão estendida do rowhammer_test ) em uma máquina de teste por 6 horas revelou uma mudança repetida de bits em 22 lugares. (consulte dados de origem e código de análise ).

O teste para strings de cunhagem gera conjuntos de três endereços (A1, A2, V):

  • V é o endereço da vítima, onde vemos a mudança de bits.
  • A1 e A2 são os endereços do agressor que criamos.
  • Classifique A1 e A2 para que A1 fique mais próximo de V que A2. Nós assumimos provisoriamente que um endereço mais próximo, A1, realmente causa uma pequena alteração (embora isso não seja necessariamente verdadeiro se um mapeamento mais complexo de endereços DRAM for usado).

Para todos esses resultados, esperamos que três propriedades sejam concluídas:

  • Linha : os números de linha A1 e V devem ser diferentes de 1, ou seja, eles devem estar em linhas adjacentes. (A2 pode ter qualquer número de linha).

    Essa propriedade facilita a determinação de onde estão os bits mais baixos do número da linha no endereço físico.

    O teste mostrou que essa propriedade é válida para todos, exceto dois resultados. Nestes dois resultados, os números das linhas diferem por 3 em vez de 1.
  • Banco : V, A1 e A2 devem ter o mesmo número de banco. De fato, essa propriedade se manifestou em todos os 22 resultados. Ele é salvo somente ao aplicar o esquema XOR'ing de linhas / bancos.
  • Canal : V, A1 e A2 devem ter o mesmo número de canal. Isso vale para todos os resultados. Acontece que todos os resultados têm canal = 0, porque rowhammer_test seleciona apenas endereços alinhados em 4k e, portanto, testa apenas um canal (talvez isso possa ser considerado um bug).

Possíveis testes adicionais


No futuro, você pode executar mais duas experiências para verificar se o mapeamento de endereço DRAM avalia corretamente a propriedade SBDR:

  • Medição do tempo : o acesso múltiplo a pares de endereços SBDR deve ser mais lento que o acesso múltiplo a pares sem SBDR, porque o primeiro causa a ativação das linhas e o segundo não.
  • Teste exaustivo de Rowhammer : assim que encontrarmos o endereço do agressor A1, que causa uma mudança repetida de bits, podemos verificar isso em muitos valores de A2. O efeito da cunhagem (A1, A2) mudará os bits apenas se for um par de SBDR.

Além disso, a remoção de um DIMM da unidade de sistema deve remover o bit do canal do mapeamento de endereço DRAM e alterar os endereços do agressor e da vítima. Isso também pode ser verificado.

Source: https://habr.com/ru/post/pt431102/


All Articles