Réserve la zone de mémoire RAM fixe en tant que périphérique de bloc (avec une adresse physique de début donnée)

11

Il y a eu beaucoup de questions sur les disques RAM et je connais les ramfs et les tmpfs qui permettent l'utilisation de ram comme périphérique bloc. Cependant, mon intérêt est d'utiliser une plage d'adresses de mémoire fixe comme périphérique de bloc.

Cela découle de la nécessité d'utiliser la RAM non volatile disponible dans mon système. J'ai 6 Go de RAM disponibles et 8 Go de RAM non volatile présents. La sortie de / proc / iomem me donne ce qui suit

100000000-17fffffff: RAM système

180000000-37fffffff: réservé

Ici, la région de 6 Go à 14 Go correspond à la région RAM non volatile qui est marquée par la carte mémoire du BIOS E820 comme réservée. Mon intention principale est d'utiliser cette NVRAM comme périphérique bloc sous Linux. Ceci est utile pour tester les systèmes NVRAM. Existe-t-il une commande linux déjà présente qui me permettrait d'utiliser cette région comme périphérique bloc, ou dois-je écrire mon propre pilote de périphérique noyau pour faciliter la même chose?

qstack
la source
2
Juste curieux, pourquoi voudriez-vous faire ça?
mtak
Il fournit un moyen simple de tester des systèmes de fichiers conçus pour la RAM non volatile sur Linux.
qstack

Réponses:

2

Je ne suis pas un expert des pilotes de périphériques, mais voici quelques conseils pour votre R&D:

  1. si la mémoire est marquée comme "réservée", le système d'exploitation ne peut pas la toucher; vous devrez trouver un moyen pour que le BIOS le marque comme disponible pour le système d'exploitation, ou utilisez des ioctl directs de bas niveau pour le contrôler.
  2. si Linux pouvait voir la mémoire, vous n'auriez toujours pas de moyen facile d'empêcher Linux de l'utiliser comme n'importe quel autre bloc de RAM; une tentative pourrait être tentée en marquant une telle RAM comme "mauvaise" puis en modifiant le noyau pour en faire un usage spécial (veuillez vérifier la documentation du noyau à ce sujet, il a beaucoup changé depuis la dernière fois que j'ai piraté et il évolue à grande vitesse)
  3. considérant ce qui précède comme une étude de faisabilité préliminaire (et non définitive ni exhaustive), je dirais que l'écriture de votre pilote de périphérique de bloc ramdisk est l'option la plus sensée dans votre cas, et peut-être devriez-vous le contribuer au noyau Linux et / ou faire équipe avec les gens qui essaient déjà cela (peut-être un meilleur endroit pour cette question est la liste de diffusion du noyau Linux , si vous n'y avez pas encore posté)

Quelques autres sources pertinentes:

Deim0s
la source
1

Avant l'introduction de tmpfs/ initramfsil était ramdiskutilisé pour charger les initrdimages, un bloc de blocs de taille fixe prédéfini, je pense contigu, au moins sur les implémentations antérieures.

Le pilote de bloc lui-même n'a pas de paramètres pour l'adresse mémoire, seulement la taille, mais le noyau utilisé pour charger les images initrd à une adresse prédéfinie (par config) donc un coup d'œil dans le code du noyau main / init pourrait aider (je soyez surpris si le ramdisk n'est plus supporté pour initrd mais comme initramfs existe depuis de nombreuses années, je n'utilise plus de ramdisk ).

La source du pilote était pilote / bloc / rd.c , si je vois bien maintenant drivers / block / brd.c .

Sinon, à la recherche de disque virtuel, j'ai trouvé une implémentation qui semble intéressante:

Disque sur RAM - Jouer avec les pilotes de bloc

Alex
la source