Force Linux para usar apenas a memória sobre 4G?
-
19-09-2019 - |
Pergunta
Eu tenho um driver de dispositivo Linux que interfina em um dispositivo que, em teoria, pode executar o DMA usando endereços de 64 bits. Eu gostaria de testar para ver que isso realmente funciona.
Existe uma maneira simples de forçar uma máquina Linux a não usar nenhuma memória abaixo do endereço físico 4G? Tudo bem se a imagem do kernel estiver em baixa memória; Eu só quero poder forçar uma situação em que conheço todos os meus buffers alocados dinamicamente, e qualquer kernel ou buffer de usuário alocado para mim não é endereçável em 32 bits. Isso é uma força pouco bruta, mas seria mais abrangente do que qualquer outra coisa que eu possa pensar.
Isso deve me ajudar a capturar (1) hardware que não foi configurado corretamente ou carregado com o endereço completo (ou está simplesmente quebrado), bem como (2) uso acidental e desnecessário de buffers de rejeição (porque não há lugar para onde saltar).
esclarecimento: Estou executando x86_64, então não me importo com a maioria dos antigos problemas de abordagem de 32 bits. Eu só quero testar que um driver pode interface corretamente com multidões de buffers usando endereços físicos de 64 bits.
Solução
/usr/src/linux/documentation/kernel-parameters.txt
memmap=exactmap [KNL,X86] Enable setting of an exact E820 memory map, as specified by the user. Such memmap=exactmap lines can be constructed based on BIOS output or other requirements. See the memmap=nn@ss option description. memmap=nn[KMG]@ss[KMG] [KNL] Force usage of a specific region of memory Region of memory to be used, from ss to ss+nn. memmap=nn[KMG]#ss[KMG] [KNL,ACPI] Mark specific memory as ACPI data. Region of memory to be used, from ss to ss+nn. memmap=nn[KMG]$ss[KMG] [KNL,ACPI] Mark specific memory as reserved. Region of memory to be used, from ss to ss+nn. Example: Exclude memory from 0x18690000-0x1869ffff memmap=64K$0x18690000 or memmap=0x10000$0x18690000
Se você adicionar memmap=4G$0
Para os parâmetros de inicialização do kernel, os 4 GB mais baixos de memória física não estarão mais acessíveis. Além disso, seu sistema não será mais inicializado ... mas alguma variação deste aqui (memmap=3584M$512M
?) Pode permitir a memória suficiente abaixo de 4 GB para o sistema inicializar, mas não o suficiente para que os buffers DMA do seu driver sejam alocados lá.
Outras dicas
IIRC Há uma opção na configuração do kernel para usar extensões PAE que permitirão que você use mais de 4 GB (estou um pouco enferrujado na configuração do kernel - o último kernel que recompilei foi 2.6.4 - por favor, desculpe minha falta de recordação). Você sabe como acionar uma configuração de kernel
make clean && make menuconfig
Espero que isso ajude, cumprimentos, Tom.