É possível alocar RAM para todo o código e dados em um arquivo ELF durante o carregamento?

1

Eu sei que, no Linux, uma página de RAM não será alocada para uma página de espaço de endereço virtual até que um endereço virtual na página seja referenciado. No entanto, estou usando o Linux embarcado em um dispositivo em que todos os arquivos ELF já estão residentes na RAM (disco RAM) antes de carregá-los (iniciando um processo de cada arquivo ELF). Então, estou pensando se é possível alocar RAM para todo o código e dados em cada arquivo ELF ao carregá-lo. Se isso for possível, acho que poderei remover cada arquivo ELF da RAM assim que todos os seus códigos e dados tiverem sido paginados na RAM, para que mais espaço de memória seja liberado para uso no futuro.

    
por xiaokaoy 14.03.2016 / 03:10

1 resposta

2

Você pode forçar todo o espaço de endereço de um processo a ser paginado com truques como mlockall() , mas isso não ajudará a economizar memória porque não importa o que o kernel mantenha o arquivo de apoio aberto por quanto tempo for mapeado na memória (mesmo que você o exclua).

O que você está procurando é chamado de eXecute In Place (XIP) e é um recurso que permite executar arquivos diretamente a partir do armazenamento mapeado em memória, em vez de copiar para RAM (separada) primeiro.

O XIP é muito difícil de suportar porque coloca requisitos severos em como o arquivo executável deve ser colocado no armazenamento (no sistema de arquivos, se aplicável). Por exemplo, as seções do arquivo que serão mapeadas na memória devem estar alinhadas na página no armazenamento e não misturadas com os metadados do sistema de arquivos. Além disso, o binário será idealmente compilado como código independente de posição para que o link de tempo de execução não tem que modificar qualquer parte depois de ser mapeado. Quase nenhum sistema de arquivos suporta XIP.

Por sorte, meu entendimento é que tmpfs faz suporte a XIP . Se isso estiver correto, sua solução é simplesmente montar um sistema de arquivos tmpfs e mover o arquivo executável para lá antes de executá-lo.

Atualizar após xiaokaoy comentou :

If I just move the executable file into tmpfs, will it automatically be able to execute in place? Why? What makes the file page-aligned in RAM? Will the loader check whether the executable file meets the required conditions to run in the XIP way every time it starts to load an executable file?

O tmpfs pode suportar o XiP devido à maneira como ele armazena arquivos na RAM. Os arquivos em tmpfs são armazenados em páginas de memória com cada arquivo sendo alocado em um número inteiro de páginas de memória não compartilhadas com outros arquivos no tmpfs. (É por isso que os arquivos em tmpfs sempre ocupam um múltiplo de 4 KiB - o tamanho da página.) Os dados são armazenados com o primeiro byte do arquivo no primeiro byte de sua página de memória e assim por diante. Então, quando mmap() (ou o carregador ELF do kernel) é chamado para mapear páginas do arquivo, ele não precisa copiar os dados para novas páginas, ele pode apenas compartilhar as páginas que já pertencem ao tmpfs - contanto que o mapeamento está alinhado (o que deve ser com ELF).

    
por 14.03.2016 / 09:12

Tags