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

11

Existem muitas perguntas sobre discos RAM e eu conheço os ramfs e tmpfs que permitem o uso do ram como um dispositivo de bloco. No entanto, meu interesse é usar um intervalo de endereços de memória fixo como um dispositivo de bloco.

Isso decorre da necessidade de usar RAM não volátil disponível no meu sistema. Tenho 6 GB de RAM disponível e 8 GB de RAM não volátil presente. 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, marcada pelo mapa de memória do E820 BIOS como reservada. 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 essa região como um dispositivo de bloco ou preciso escrever meu próprio driver de dispositivo do kernel para facilitar o mesmo?

qstack
fonte
2
Apenas curioso, por que você quer fazer isso?
mtak
Ele fornece uma maneira fácil de testar sistemas de arquivos projetados para RAM não volátil no linux.
qstack

Respostas:

2

Eu não sou especialista em drivers de dispositivo, no entanto, aqui estão alguns indicadores para sua pesquisa e desenvolvimento:

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

Algumas outras fontes relevantes:

Deim0s
fonte
1

Antes da introdução de tmpfs/ initramfshouve ramdisko carregamento das initrdimagens, um bloco de tamanho fixo pré-definido, acho contíguo, pelo menos em implementações anteriores.

O driver de bloco em si não possui parâmetros para o endereço de memória, apenas o tamanho, mas o kernel costumava carregar imagens initrd em um endereço predefinido (por config) para que uma espiada no código principal / init do kernel pudesse ajudar (eu fique surpreso se o ramdisk não for mais suportado pelo initrd, mas como o initramfs existe, há muitos anos, nunca mais utilizou o ramdisk ).

A fonte motorista estava drivers / block / rd.c , se eu ver correctamente agora é drivers / block / brd.c .

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

Disco na RAM - Tocando com drivers de bloco

Alex
fonte