Reserve região de memória RAM fixa como um dispositivo de bloco (com um determinado endereço físico inicial)

11

Tem havido muitas dúvidas sobre discos RAM e estou ciente de ramfs e tmpfs que permitem o uso de memória RAM como um dispositivo de bloco. No entanto, meu interesse está em usar um intervalo de endereço de memória fixo como um dispositivo de bloco.

Isso surge da necessidade de usar memória RAM não volátil disponível no meu sistema. Tenho 6 GB de RAM disponíveis e 8 GB de RAM não volátil presentes. A saída de / proc / iomem me fornece o seguinte

100000000-17fffffff: RAM do sistema

180000000-37fffffff: reservado

Aqui, a região de 6 GB a 14 GB corresponde à região de RAM não volátil, que é marcada pelo mapa de memória do BIOS E820, conforme reservado. Minha principal intenção é usar esta NVRAM como um dispositivo de bloco no linux. Isso é útil para testar sistemas NVRAM. Existe algum comando linux já presente que me permita usar esta região como um dispositivo de bloco, ou eu tenho que escrever meu próprio driver de dispositivo do kernel para facilitar o mesmo?

    
por qstack 24.08.2014 / 15:16

2 respostas

2

Eu não sou especialista em drivers de dispositivos, no entanto, aqui estão algumas dicas para o seu R & D:

  1. se a memória estiver marcada como "reservada", o SO não poderá tocá-la; você terá que encontrar uma maneira de ter o BIOS marcando-o como disponível para o sistema operacional, ou usar ioctl s para controlá-lo
  2. se o Linux pudesse ver a memória, você ainda não teria uma maneira fácil de evitar que o Linux o utilizasse como qualquer outro bloco de RAM; uma tentativa poderia ser tentada marcando tal RAM como "ruim" e então modificando o kernel para ainda fazer um uso especial dele (por favor verifique a documentação do kernel a respeito disso, ele mudou muito desde a última vez Eu invadi-lo e está evoluindo a uma grande velocidade)
  3. considerando o acima como um estudo de viabilidade preliminar (e não definitivo nem exaustivo), eu diria que escrever seu driver blockdevice de ramdisk é a opção mais sensata no seu caso, e talvez você deva contribuir com ele para o kernel Linux e / ou junte-se a pessoas que já estejam tentando isso (talvez um lugar melhor para essa questão seja a lista de discussão do Kernel do Linux , se você ainda não postou lá)

Algumas outras fontes relevantes:

por 26.09.2014 / 13:47
1

Antes da introdução de tmpfs / initramfs , havia ramdisk usado para carregar as initrd images, um dispositivo de blocos de tamanho fixo predefinido, acho que é contíguo, pelo menos em implementações anteriores.

O driver de bloco em si não tem parâmetros para o endereço de memória, apenas o tamanho, mas o kernel usado para carregar as imagens initrd em um endereço pré-definido (por configuração) para dar uma espiada em main / init código do kernel pode ajudar (eu ficaria surpreso se o ramdisk não for mais suportado pelo initrd mas desde que initramfs esteja por perto, muito de anos, nunca mais usou ramdisk ).

A fonte do driver era drivers / block / rd.c , se eu vejo corretamente agora é drivers / block / brd.c .

Senão, procurando por ramdisk , encontrei uma implementação que parece interessante:

Disco na RAM - Jogando com Drivers de Bloqueio

    
por 28.09.2014 / 10:44