Eu tenho um SoC-FPGA (DE0-nano-soc) que contém uma CPU ARM-Cortex-A9 com um FPGA Cyclone V em um único chip. a CPU tem acesso a 1gb de memória DDR3, mas o FPGA também pode acessar essa memória para compartilhar dados.
Agora eu configurei o linux para ver apenas 900M do total de RAM usando o parâmetro boot mem=900M
. Desta forma eu tenho um pouco de memória RAM que o linux não toca que posso usar para me comunicar com o FPGA. Eu quero escrever nessa parte da RAM usando /dev/mem
. Recebo um erro de permissão negada quando mapeio de memória o endereço apropriado, suponho que seja porque meu kernel foi CONFIG_STRICT_DEVMEM
definido.
Agora eu realmente não quero desabilitar isso, pois eu realmente só preciso escrever para endereços que o linux não usa. Existe uma maneira de dizer ao kernel do linux que não há problema em gravar nessa parte específica, mas a memória normal ainda tem limites?
Eu encontrei isso: https://docs.pmem.io/getting-started-guide/creating-development-environments/linux-environments/linux-memmap
Supondo que você tenha um kernel novo o suficiente, a adição
memmap=124!900
deve tornar a memória desejada acessível como arquivos/dev/pmem0
.É aconselhável adicionar também
nokaslr
, caso contrário, você poderá obter erros aleatórios do sistema. KASLR é um recurso de segurança que dificulta a exploração do kernel.Embora isso tenha sido usado para hacks fascinantes , não posso recomendá-lo para o seu caso. Eu não sei como gerenciar os caches da CPU versus atualizações do FPGA (também conhecido como DMA). E nosso conselho em outras questões é não fazer isso :-).
Há também outra opção, embora não responda à pergunta como está escrita. Acho que você pode inicializar com
iomem=relaxed
, se quiser desativar temporariamente o STRICT_DEVMEM sem compilar um kernel totalmente novo.