Forza Linux di utilizzare solo la memoria sopra 4G?
-
19-09-2019 - |
Domanda
Ho un driver di dispositivo Linux che si interfaccia a un dispositivo che, in teoria, in grado di eseguire DMA utilizzando indirizzi a 64 bit. Mi piacerebbe provare a vedere che questo funziona realmente.
C'è un modo semplice che posso forzare una macchina Linux di non usare alcuna memoria sotto indirizzo fisico 4G? Va bene se l'immagine del kernel è in condizioni di scarsa memoria; Voglio solo essere in grado di forzare una situazione in cui so che tutti i miei buffer allocati dinamicamente, e qualsiasi kernel o utente buffer allocati per me, non sono indirizzabili a 32 bit. Questo è un po 'di forza bruta, ma sarebbe più completo di qualsiasi altra cosa che posso pensare.
Questo dovrebbe aiutarmi cattura (1) l'hardware che non è stato configurato correttamente o caricato con l'indirizzo completo (o è semplicemente rotto), nonché (2) l'uso accidentale e non necessario di buffer rimbalzo (perché non c'è nessun posto dove rimbalzo a).
Chiarimento : Io corro x86_64, quindi non si preoccupano la maggior parte dei vecchi numeri di indirizzamento a 32 bit. Voglio solo provare che un pilota in grado di interfacciarsi correttamente con moltitudini di buffer utilizzando indirizzi fisici a 64 bit.
Soluzione
/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 memmap=nn@ss 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
Se si aggiungono memmap=4G$0
ai parametri di boot del kernel, la più bassa 4 GB di memoria fisica non sarà più accessibile. Inoltre, il sistema non sarà più di boot ... ma qualche variazione del presente documento (memmap=3584M$512M
?) Può consentire di memoria sufficiente sotto 4GB per il sistema per l'avvio, ma non basta che i buffer DMA del vostro driver verranno assegnati lì.
Altri suggerimenti
IIRC c'è un'opzione all'interno di configurazione del kernel di utilizzare le estensioni PAE, che vi permetterà di utilizzare più di 4 GB (io sono un po 'arrugginito sulla configurazione del kernel - ultimo kernel ricompilato mi era 2.6.4 - quindi vi prego di scusare la mia mancanza di richiamo ). Non sai come innescare una configurazione del kernel
make clean && make menuconfig
Spero che questo aiuti, I migliori saluti, Tom.