2009-12-16 16 views
7

Tengo un controlador de dispositivo Linux que se conecta a un dispositivo que, en teoría, puede realizar DMA usando direcciones de 64 bits. Me gustaría probar para ver que esto realmente funciona.¿Forzar a Linux a usar solo memoria sobre 4G?

¿Existe alguna manera simple de forzar a una máquina Linux a no utilizar ninguna memoria por debajo de la dirección física 4G? Está bien si la imagen del kernel está en memoria baja; Solo quiero forzar una situación en la que conozco todos mis buffers asignados dinámicamente, y cualquier kernel o buffers de usuario asignados para mí no son direccionables en 32 bits. Esta es una pequeña fuerza bruta, pero sería más completa que cualquier otra cosa que se me ocurra.

Esto debería ayudarme a detectar (1) el hardware que no se configuró correctamente o cargó con la dirección completa (o simplemente se rompe) así como (2) el uso accidental y innecesario de los búferes de rebote (porque no hay lugar para rebote a).

aclaración: Estoy ejecutando x86_64, por lo que no me preocupo por la mayoría de los viejos problemas de direccionamiento de 32 bits. Solo quiero probar que un controlador puede interactuar correctamente con multitud de búferes usando direcciones físicas de 64 bits.

Respuesta

7

/usr/src/linux/Documentation/kernel-parameters.txt

  memmap=exactmap [KNL,X86] Enable setting of an exact 
         E820 memory map, as specified by the user. 
         Such memmap=exactmap lines can be constructed based on 
         BIOS output or other requirements. See the [email protected] 
         option description. 

     memmap=nn[KMG]@ss[KMG] 
         [KNL] Force usage of a specific region of memory 
         Region of memory to be used, from ss to ss+nn. 

     memmap=nn[KMG]#ss[KMG] 
         [KNL,ACPI] Mark specific memory as ACPI data. 
         Region of memory to be used, from ss to ss+nn. 

     memmap=nn[KMG]$ss[KMG] 
         [KNL,ACPI] Mark specific memory as reserved. 
         Region of memory to be used, from ss to ss+nn. 
         Example: Exclude memory from 0x18690000-0x1869ffff 
           memmap=64K$0x18690000 
           or 
           memmap=0x10000$0x18690000

Si agrega memmap=4G$0 a los parámetros de arranque del kernel, el menor de 4 GB de memoria física ya no será accesible. Además, su sistema ya no arrancará ... pero alguna variación de este (memmap=3584M$512M?) Puede permitir suficiente memoria por debajo de 4 GB para que el sistema arranque, pero no lo suficiente como para que los búfers DMA de su controlador se asignen allí.

+0

Eso parece estar muy cerca de lo que necesito. Hay dos advertencias: primero, memmap = nn $ ss puede evitar que el kernel lea dispositivos mapeados en memoria, incluyendo todo en el bus PCI/PCIe. En segundo lugar, no tengo manera de evitar que la memoria necesaria en el arranque, pero luego liberado (como la imagen initrd) de ser reciclado como memorias intermedias DMA. Todavía una respuesta útil, gracias. –

0

IIRC hay una opción dentro de la configuración del kernel para usar extensiones PAE que le permitirán usar más de 4GB (estoy un poco oxidado en la configuración del kernel; el último kernel que recompuse fue 2.6.4), por favor disculpe mi falta de recordar). Usted sabe cómo activar una configuración del núcleo

make clean && make menuconfig

Espero que esto ayude, Saludos, Tom.

+1

Usted entiende mal; Quiero iniciar un sistema que _only_ usa> 4GB de memoria. –

+0

@Eric Seppanen: ¡Mis disculpas! ¡Sip! Definitivamente malentendido. Cuando vi la respuesta de Ephemient, ¡fui duh! Me olvidé por completo de todos los parámetros de arranque de Memmap pero nunca los utilicé ... te hace darte cuenta de que cuando no tienes mucha memoria no te molestas en usar esos parámetros de arranque ... ¡disculpa la confusión! :( – t0mm13b

Cuestiones relacionadas