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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top