Tamanho da memória para operação mmap do kernel

9

Estou interessado na maneira como os arquivos mmaps do Linux são armazenados na memória principal (no meu contexto é para execução, mas acho que o processo mmap é o mesmo para escrever e ler também) e qual o tamanho que ele usa.

Então eu sei que o Linux usa paginação com tamanho de página geralmente de 4kB (onde no kernel posso encontrar esse tamanho?). Mas o que exatamente isso significa para a memória alocada: suponha que você tenha um binário de tamanho de alguns milhares de bytes, digamos 5812B e você o executará. O que acontece no kernel: ele aloca 2 * 4kB e copia o 5812B para este espaço, desperdiçando> 3KB de memória principal na 2ª página?

Seria ótimo se alguém conhecesse o arquivo na fonte do kernel onde o tamanho da página está definido.

Minha segunda pergunta também é muito simples, eu acho: eu assumi o 5812B como um tamanho de arquivo. É certo que esse tamanho seja simplesmente retirado do inode?

Rui F Ribeiro
fonte

Respostas:

6

Não há relação direta entre o tamanho do executável e o tamanho da memória. Aqui está uma visão geral muito rápida do que acontece quando um binário é executado:

  1. O kernel analisa o arquivo e o divide em seção. Algumas seções são carregadas diretamente na memória, em páginas separadas. Algumas seções não são carregadas (por exemplo, símbolos de depuração).
  2. Se o executável estiver vinculado dinamicamente, o kernel chamará o carregador dinâmico e carregará as bibliotecas compartilhadas necessárias e executará a edição do link conforme necessário.
  3. O programa começa a executar seu código e, geralmente, solicita mais memória para armazenar dados.

Para obter mais informações sobre formatos executáveis, vinculação e carregamento de executável, leia Linkers and Loaders de John R. Levine .

Em um executável de 5kB, é provável que tudo seja código ou dados que precisam ser carregados na memória, exceto o cabeçalho. O código executável será de pelo menos uma página, talvez duas, e haverá pelo menos uma página para a pilha, provavelmente uma página ou para a pilha (outros dados), além de memória usada por bibliotecas compartilhadas.

No Linux, você pode inspecionar os mapeamentos de memória para um executável com cat /proc/$pid/maps. O formato está documentado na proc(5)página do manual; consulte também Noções básicas sobre Linux / proc / id / maps .

Gilles 'SO- parar de ser mau'
fonte
0

Sim: você finalmente recebe duas páginas de 4k. Os dados são carregados sob demanda; portanto, se nada se referir à segunda página, nunca será carregado na memória.

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

Não altere esses valores e espere que algo funcione.

Sim, o tamanho do arquivo é armazenado no inode no ext2 / 3.

pjc50
fonte
0

Para a parte de definição, em um kernel 2.6.38 ~ ish para a arquitetura Intel:

arch / x86 / include / asm / page_types.h:

/ * PAGE_SHIFT determina o tamanho da página * /

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC (1, UL) << PAGE_SHIFT)

Frederik Deweerdt
fonte