Si vous voulez que le système d'exploitation soit totalement ignorez-le, vous devez faire un trou de mémoire en utilisant "memmap
." Voir cette référence. Par exemple, si vous voulez 512M à la barrière de 2 Go, vous pouvez mettre "memmap=512M$2G
" sur la ligne de commande de votre noyau.
Vous devrez vérifier votre dmesg
pour trouver un trou contigu à voler afin de ne piétiner aucun appareil ; qui est spécifique à votre carte mère + cartes.
Ce n'est pas la manière recommandée de faire les choses - voir la réponse de Warren Young pour savoir comment le faire correctement (pilotes du noyau + DMA). Je réponds exactement à la question que vous avez posée. Si vous prévoyez de faire cela pour les utilisateurs finaux, ils vont détester vous si vous leur faites ça... croyez-moi, c'est la seule raison pour laquelle je connaissais cette réponse.
Modifier :si vous utilisez grub2 avec grubby (par exemple, CentOS 7), vous devez vous assurer d'échapper au $. Il devrait y avoir un seul \
avant $
. Exemple :
$ 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"
Ce que vous demandez s'appelle DMA. Vous devez écrire un pilote pour réserver cette mémoire.
Oui, je me rends compte que vous avez dit que vous ne vouliez pas que le système d'exploitation intervienne et qu'un pilote fasse partie du système d'exploitation, mais en l'absence de réservation de pilote, le noyau pense que toute la mémoire lui appartient. (À moins que vous ne disiez au noyau d'ignorer le bloc de mémoire, selon la réponse d'Aaron, c'est-à-dire.)
Le chapitre 15 (PDF) de "Linux Device Drivers, 3/e" par Rubini, Corbet et Kroah-Hartmann couvre le DMA et des sujets connexes.
Si vous voulez une version HTML de ceci, j'ai trouvé la deuxième édition du chapitre ailleurs en ligne. Attention, la 2e édition a maintenant plus de dix ans, étant sortie lorsque le noyau 2.4 était nouveau. Il y a eu beaucoup de travail sur le sous-système de gestion de la mémoire du noyau depuis ces jours, il se peut donc qu'il ne s'applique plus très bien.
Pour réserver un bloc de mémoire à partir du noyau sous Linux basé sur ARM, vous pouvez également utiliser un reserved-memory
noeud dans votre fichier d'arborescence de périphériques (dts). Dans la documentation du noyau (voir ici), il y a un exemple :
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>;
};
};