Se vuoi che il sistema operativo sia completamente ignoralo, devi creare un buco nella memoria usando "memmap
." Vedi questo riferimento. Ad esempio, se vuoi 512 MB alla barriera dei 2 GB, puoi inserire "memmap=512M$2G
" sulla riga di comando del kernel.
Dovrai controllare il tuo dmesg
per trovare un buco contiguo da rubare in modo da non calpestare nessun dispositivo; che è specifico per la scheda madre e le schede.
Questo non il modo consigliato per fare le cose - vedi la risposta di Warren Young su come farlo correttamente (driver del kernel + DMA). Rispondo esattamente alla domanda che hai fatto. Se hai intenzione di farlo per gli utenti finali, odieranno tu se gli fai questo... fidati di me, questa è l'unica ragione per cui conoscevo questa risposta.
Modifica:se stai usando grub2 con grubby (ad es. CentOS 7), devi assicurarti di sfuggire al file $. Dovrebbe esserci un solo \
prima di $
. Esempio:
$ sudo -v
$ sudo grubby --update-kernel=ALL --args=memmap='128M\\$0x57EF0000'
$ sudo grubby --info $(sudo grubby --default-kernel) | grep memmap
args="ro crashkernel=auto ... memmap=128M\$0x57EF0000"
Quello che stai chiedendo si chiama DMA. Devi scrivere un driver per riservare questa memoria.
Sì, mi rendo conto che hai detto che non volevi che il sistema operativo intervenisse e che un driver diventa parte del sistema operativo, ma in assenza di una prenotazione del driver, il kernel crede che tutta la memoria gli appartenga. (A meno che tu non dica al kernel di ignorare il blocco di memoria, secondo la risposta di Aaron, cioè.)
Il capitolo 15 (PDF) di "Linux Device Drivers, 3/e" di Rubini, Corbet e Kroah-Hartmann copre DMA e argomenti correlati.
Se vuoi una versione HTML di questo, ho trovato la versione della seconda edizione del capitolo altrove online. Attenzione che la 2a edizione ha ormai più di un decennio, essendo uscita quando il kernel 2.4 era nuovo. C'è stato molto lavoro sul sottosistema di gestione della memoria del kernel da quei giorni, quindi potrebbe non essere più applicabile molto bene.
Per riservare un blocco di memoria dal kernel in Linux basato su ARM, puoi anche usare un reserved-memory
nodo nel file dell'albero dei dispositivi (dts). Nella documentazione del kernel (vedi qui), c'è un esempio:
memory {
reg = <0x40000000 0x40000000>;
};
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
/* global autoconfigured region for contiguous allocations */
linux,cma {
compatible = "shared-dma-pool";
reusable;
size = <0x4000000>;
alignment = <0x2000>;
linux,cma-default;
};
display_reserved: [email protected] {
reg = <0x78000000 0x800000>;
};
multimedia_reserved: [email protected] {
compatible = "acme,multimedia-memory";
reg = <0x77000000 0x4000000>;
};
};