Comment puis-je réserver un bloc de memory à partir du kernel Linux?

J'ai un périphérique qui a besoin d'un bloc de memory qui lui est réservé, sans que l'OS n'intervienne. Existe-t-il un moyen de dire au BIOS ou au operating system qu'un bloc de memory est réservé et qu'il ne doit pas l'utiliser?

J'utilise ce périphérique sur une machine openSUSE.

Ce que vous requestz est appelé DMA. Vous devez écrire un pilote pour réserver cette memory.

Oui, je me rends count que vous avez dit que vous ne vouliez pas que le operating system intervienne et qu'un pilote fasse partie du operating system, mais en l'absence de réservation du pilote, le kernel pense que toute la memory lui appartient. (Sauf si vous dites au kernel d'ignorer le bloc de memory, selon la réponse d'Aaron, c'est-à-dire.)

Le chapitre 15 (PDF) de « Linux Device Drivers, 3 / e » de 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. Méfiez-vous que la deuxième édition date de plus d'une décennie, après avoir été publiée lorsque le kernel 2.4 était nouveau. Il y a eu beaucoup de travail sur le sous-système de memory management du kernel depuis ces time-là, donc cela peut ne plus s'appliquer très bien.

Si vous voulez que le operating system l'ignore totalement , vous devez faire un trou de memory en utilisant " memmap ". Voir cette reference . Par exemple, si vous voulez 512M à la barrière de 2 Go, vous pouvez mettre " memmap=512M$2G " sur votre command line du kernel.

Vous devrez vérifier votre dmesg pour find un trou contigu à voler afin de ne pas piétiner les périphériques; c'est spécifique à votre carte mère + maps.

Ce n'est pas le moyen recommandé de faire les choses – voir la réponse de Warren Young pour savoir comment le faire correctement (pilotes du kernel + DMA). Je réponds à la question exacte que vous avez posée. Si vous prévoyez faire cela pour les users finaux, ils vous détesteront si vous leur faites ça … croyez-moi, c'est la seule raison pour laquelle j'ai su cette réponse.


Edit: Si vous utilisez grub2 w / grubby (par exemple CentOS 7), vous devez vous assurer d'échapper à la $ . Il devrait y avoir un seul \ before $ . 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" 

Pour réserver un bloc de memory à partir du kernel dans Linux basé sur ARM, vous pouvez également utiliser un nœud de reserved-memory dans votre file d'arborescence de périphériques (dts). Dans la documentation du kernel (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: framebuffer@78000000 { reg = <0x78000000 0x800000>; }; multimedia_reserved: multimedia@77000000 { compatible = "acme,multimedia-memory"; reg = <0x77000000 0x4000000>; }; }; 

Entrez d'abord cette command pour vérifier votre réglage actuel:

 sysctl vm.min_free_kbytes 

Pour modifier la valeur définie, éditez /etc/sysctl.conf . Cherchez la ligne:

 vm.min_free_kbytes=12888 

S'il n'existe pas, créez-le (avec votre valeur désirée). Les valeurs suivantes sont acceptables:

 8192 12288 16384 20480 

8M est extrêmement conservateur; il peut s'asseoir confortablement à 16M. Une fois que vous changez la valeur, exécutez ceci et aucun redémarrage n'est nécessaire:

 sudo sysctl -p