Reserve la región de memoria RAM fija como un dispositivo de bloque (con una dirección física de inicio dada)

11

Ha habido muchas preguntas sobre los Discos RAM y estoy al tanto de ramfs y tmpfs que permiten el uso de ram como dispositivo de bloque. Sin embargo, mi interés está en usar un rango fijo de direcciones de memoria como un dispositivo de bloque.

Esto surge de la necesidad de usar RAM no volátil disponible en mi sistema. Tengo 6 GB de RAM disponibles y 8 GB de RAM no volátil. La salida de / proc / iomem me da lo siguiente

100000000-17fffffff: RAM del sistema

180000000-37fffffff: reservado

Aquí la región de 6GB a 14GB corresponde a la región RAM no volátil que está marcada por el mapa de memoria del BIOS E820 como reservado. Mi intención principal es usar esta NVRAM como un dispositivo de bloque en Linux. Esto es útil para probar sistemas NVRAM. ¿Hay algún comando de Linux ya presente que me permita usar esta región como un dispositivo de bloque, o tengo que escribir mi propio controlador de dispositivo kernel para facilitarlo?

qstack
fuente
2
Solo por curiosidad, ¿por qué quieres hacer esto?
mtak
Proporciona una manera fácil de probar sistemas de archivos diseñados para RAM no volátil en Linux.
qstack

Respuestas:

2

No soy un experto en controladores de dispositivos, sin embargo, aquí hay algunos consejos para su I + D:

  1. si la memoria está marcada como "reservada", el sistema operativo no puede tocarla; tendrá que encontrar una manera de que el BIOS lo marque como disponible para el sistema operativo, o use ioctl s directos de bajo nivel para controlarlo
  2. si Linux pudiera ver la memoria, todavía no tendría una manera fácil de evitar que Linux la use como cualquier otro bloque de RAM; Se podría intentar un intento marcando la RAM como "mala" y luego modificando el kernel para hacer un uso especial (consulte la documentación del kernel al respecto, ha cambiado mucho desde la última vez que la pirateé y está evolucionando) a gran velocidad)
  3. Considerando lo anterior como un estudio de factibilidad preliminar (y no definitivo ni exhaustivo), diría que escribir su controlador de dispositivo de bloqueo ramdisk es la opción más sensata en su caso, y tal vez debería contribuir al núcleo de Linux y / o formar un equipo con personas que ya lo intentan (tal vez un mejor lugar para esta pregunta es la lista de correo del kernel de Linux , si aún no ha publicado allí)

Algunas otras fuentes relevantes:

Deim0s
fuente
1

Antes de la introducción de tmpfs/ initramfsthere se ramdiskutilizó para cargar las initrdimágenes, un dispositivo de bloque de tamaño fijo predefinido, creo contiguo, al menos en implementaciones anteriores.

El controlador de bloque en sí no tiene parámetros para la dirección de memoria, solo el tamaño, pero el kernel solía cargar imágenes initrd en una dirección predefinida (por configuración), por lo que un vistazo al código del kernel main / init podría ayudar (lo haría se sorprenderá si ramdisk ya no es compatible con initrd, pero dado que initramfs existe, hace muchos años, nunca más usó ramdisk ).

La fuente conductor era drivers / block / rd.c , si veo correctamente ahora es drivers / block / brd.c .

De lo contrario, buscando ramdisk encontré una implementación que parece interesante:

Disco en RAM - Jugar con controladores de bloque

Alex
fuente