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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top