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 d'une 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 les 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 plus de dix ans maintenant, é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, donc il se peut qu'il ne s'applique plus très bien.
Si vous voulez que le système d'exploitation l' ignore totalement , 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 votre ligne de commande du noyau.Vous devrez vérifier votre
dmesg
pour trouver un trou contigu à voler afin de ne pas piétiner sur aucun appareil; qui est spécifique à votre carte mère + cartes.Ce n'est pas la façon 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 à la question exacte que vous avez posée. Si vous prévoyez de faire cela pour les utilisateurs finaux, ils vous détesteront si vous leur faites cela ... croyez-moi, c'est la seule raison pour laquelle je connaissais cette réponse.
Edit: Si vous utilisez grub2 w / grubby (par exemple CentOS 7), vous devez vous assurer d'échapper au $ . Il devrait y en avoir un
\
avant$
. Exemple:la source
uint8_t *ptr = 0x8000000
" avec mon exemple? Ou cela peut se briser ... Huh, je ne sais vraiment pas. Encore une fois, je connaissais la réponse parce que j'étais un utilisateur final d'une carte PCI mal conçue où je devais allouer manuellement un tampon sous la marque 4G, puis dire à un pilote où se trouvait cet espace; cela peut ne pas être possible depuis l'espace utilisateur.MMAP_FIXED | MMAP_ANON
. Sans un appareil DMA personnalisé ici pour jouer, je ne peux pas dire s'il fait vraiment ce que l'OP voulait, mais ma boîte CentOS m'a heureusement donné un bloc de 8 Mo à 512 Mo lorsque je l'ai ditmemmap=8M$512M
dans GRUB. Il ne nécessite même pas d'accès root, comme je l'avais craint. Mais même si cela fait la bonne chose, je pense toujours que vous aurez probablement besoin d'un pilote pour gérer les interruptions et autres.mmap()
les pages d sont mises à zéro avant que le code utilisateur ne puisse les voir. C'est fait pour la sécurité, afin que les données ne fuient pas d'un processus à l'autre. Une autre raison d'utiliser un pilote, car vous devrez peut-être conserver le contenu de la mémoire tampon DMA au moment du chargement du pilote. Oh et en passant, l'mmap()
appel localisé arbitrairement réussit même sans l'memmap
option de démarrage du noyau, au moins tant que personne n'utilise déjà la mémoire située là où vous l'avez demandé. L'option de démarrage augmente sans aucun doute les chances de succès, mais ce n'est pas strictement nécessaire.Pour réserver un bloc de mémoire du noyau dans Linux basé sur ARM, vous pouvez également utiliser un
reserved-memory
nœud dans votre fichier d'arborescence de périphériques (dts). Dans la documentation du noyau (voir ici ), il y a un exemple:la source
Entrez d'abord cette commande, pour vérifier votre paramètre actuel:
Pour modifier la valeur définie, modifiez
/etc/sysctl.conf
. Recherchez la ligne:S'il n'existe pas, créez-le (avec la valeur souhaitée). Les valeurs suivantes sont acceptables:
8M est extrêmement conservateur; il peut s'asseoir à 16M confortablement. Une fois que vous avez modifié la valeur, exécutez-la et aucun redémarrage n'est nécessaire:
la source