Como posso reservar um bloco de memória do kernel do Linux?

23

Eu tenho um dispositivo que precisa de um bloco de memória reservado exclusivamente para ele, sem que o SO interfira. Existe alguma maneira de dizer ao BIOS ou ao SO que um bloco de memória está reservado e não deve usá-lo?

Estou usando este dispositivo em uma máquina do openSUSE.

    
por Nathan Fellman 01.05.2012 / 21:07

4 respostas

23

O que você está pedindo é chamado de DMA. Você precisa escrever um driver para reservar essa memória.

Sim, eu sei que você disse que não queria que o sistema operacional interviesse e que um driver se tornasse parte do SO, mas, na ausência de uma reserva de driver, o kernel acredita que toda a memória pertence a ele. (A menos que você diga ao kernel para ignorar o bloco de memória, isto é, por resposta de Aaron.)

Capítulo 15 (PDF) de " Drivers de Dispositivos Linux, 3 / e ", de Rubini, Corbet e Kroah-Hartmann, abrangem DMA e tópicos relacionados.

Se você quiser uma versão em HTML, achei a segunda edição do capítulo a> em outro lugar online. Tenha em atenção que a segunda edição já tem mais de uma década, tendo surgido quando o kernel 2.4 era novo. Tem havido muito trabalho no subsistema de gerenciamento de memória do kernel desde então, então pode não se aplicar muito mais.

    
por 01.05.2012 / 21:28
23

Se você quer que o SO ignore , você precisa fazer um furo de memória usando " memmap ." Veja esta referência . Por exemplo, se você quer 512M na barreira de 2GB, você pode colocar " memmap=512M$2G " na sua linha de comando do kernel.

Você precisará verificar seu dmesg para encontrar um buraco contíguo para roubar para não pisar em nenhum dispositivo; isso é específico para sua placa-mãe + cartões.

Esta não é a maneira recomendada de fazer as coisas - veja a resposta de Warren Young sobre como fazer isso corretamente (drivers do kernel + DMA). Eu estou respondendo a pergunta exata que você pediu. Se você planeja fazer isso para os usuários finais, eles odeiam você se você fizer isso com eles ... confie em mim, essa é a única razão pela qual eu sabia essa resposta.

Edit: Se você estiver usando o grub2 w / grubby (ex: CentOS 7), você precisa se certificar de escapar o $ . Deve haver um único \ antes de $ . Exemplo:

$ 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\$ 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\%pre%x57EF0000"
x57EF0000"     
por 02.05.2012 / 01:10
4

Para reservar um bloco de memória do kernel no Linux baseado em ARM, você também pode usar um nó reserved-memory no arquivo da árvore de dispositivos (dts). Na documentação do kernel (veja aqui ), há um exemplo :

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>;
    };
};
    
por 02.12.2016 / 09:37
0

Primeiro, insira este comando para verificar sua configuração atual:

sysctl vm.min_free_kbytes

Para alterar o valor definido, edite /etc/sysctl.conf . Procure a linha:

vm.min_free_kbytes=12888

Se não existir, crie-o (junto com o valor desejado). Os seguintes valores são aceitáveis:

8192
12288
16384
20480

8M é extremamente conservador; pode sentar-se confortavelmente aos 16M. Depois de alterar o valor, execute isso e não é necessário reinicializar:

sudo sysctl -p
    
por 24.01.2013 / 09:07