web-dev-qa-db-fra.com

Comment puis-je réserver un bloc de mémoire du noyau Linux?

J'ai un appareil qui nécessite un bloc de mémoire qui est réservé uniquement à celui-ci, sans le système d'exploitation intermédiaire. Existe-t-il un moyen de dire au BIOS ou au système d'exploitation qu'un bloc de mémoire est réservé et qu'il ne doit pas l'utiliser?

J'utilise cet appareil sur une machine openSuse.

26
Nathan Fellman

Ce que vous demandez est appelé 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 conducteur devienne une partie du système d'exploitation, mais en l'absence de réserve d'un conducteur, le noyau croit que toute la mémoire lui appartient. (Sauf si vous disez au noyau d'ignorer le bloc de mémoire, par réponse d'Aaron, c'est-à-dire.)

chapitre 15 (pdf) de " pilotes de périphérique Linux, 3/E " de Rubini, Corbet et Kroah-Hartmann Covers DMA et associés les sujets.

Si vous souhaitez une version HTML de cela, j'ai trouvé la version de deuxième édition du chapitre ailleurs en ligne. Méfiez-vous que la 2e édition a plus d'une décennie 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-ci, de sorte qu'il ne peut plus s'appliquer très bien.

24
Warren Young

Pour réserver un bloc de mémoire du noyau In ARM basé sur Linux, vous pouvez également utiliser un reserved-memory noeud dans votre fichier arborescent de périphérique (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: framebuffer@78000000 {
        reg = <0x78000000 0x800000>;
    };

    multimedia_reserved: multimedia@77000000 {
        compatible = "acme,multimedia-memory";
        reg = <0x77000000 0x4000000>;
    };
};
5
Vladimir S.

Premier entrez cette commande pour vérifier votre paramètre actuel:

sysctl vm.min_free_kbytes

Pour changer la valeur définie, éditer /etc/sysctl.conf. Cherchez la ligne:

vm.min_free_kbytes=12888

Si cela n'existe pas, créez-le (avec votre valeur souhaitée). Les valeurs suivantes sont acceptables:

8192
12288
16384
20480

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

Sudo sysctl -p
0
user31056