Noções básicas sobre Linux / proc / id / maps

Estou tentando entender o uso de memory do meu aplicativo Linux incorporado. O utilitário / arquivo / proc / pid / maps parece ser um bom recurso para ver os detalhes. Infelizmente eu não entendo todas as colunas e inputs.

Existe um bom recurso / documentação para o utilitário / arquivo proc / pid / maps?

O que significa as inputs anônimas do inode 0? Estes parecem ser alguns dos maiores segmentos de memory.

Cada linha em /proc/$PID/maps descreve uma região de memory virtual contígua em um processo ou thread. Cada linha tem os seguintes campos:

 address perms offset dev inode pathname 08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm 
  • address – Este é o endereço inicial e final da região no espaço de endereço do processo
  • permissions – descreve como as páginas na região podem ser acessadas. Existem quatro permissions diferentes: ler, escrever, executar e compartilhar. Se a leitura / gravação / execução estiver desabilitada, um ‘-‘ aparecerá em vez do ‘r’ / ‘w’ / ‘x’. Se uma região não é compartilhada, ela é privada, então um ‘p’ aparecerá em vez de um ‘s’. Se o processo tentar acessar a memory de uma maneira que não seja permitida, uma falha de segmentação será gerada. As permissions podem ser alteradas usando a chamada do sistema mprotect .
  • offset – Se a região foi mapeada de um arquivo (usando mmap ), este é o offset no arquivo onde o mapeamento começa. Se a memory não foi mapeada de um arquivo, é apenas 0.
  • dispositivo – Se a região foi mapeada de um arquivo, esse é o número principal e secundário do dispositivo (em hexadecimal) onde o arquivo reside.
  • inode – Se a região foi mapeada de um arquivo, esse é o número do arquivo.
  • pathname – Se a região foi mapeada de um arquivo, esse é o nome do arquivo. Este campo está em branco para regiões mapeadas anônimas. Existem também regiões especiais com nomes como [heap] , [stack] ou [vdso] . [vdso] significa object compartilhado dynamic virtual. É usado pelas chamadas do sistema para mudar para o modo kernel. Aqui está um bom artigo sobre isso.

Você pode notar muitas regiões anônimas. Geralmente, eles são criados pelo mmap mas não são anexados a nenhum arquivo. Eles são usados ​​para muitas coisas diversas, como memory compartilhada ou buffers não alocados no heap. Por exemplo, acho que a biblioteca pthread usa regiões mapeadas anônimas como pilhas para novos threads.

proc(5)

mmap(2)

“Entendendo o Kernel Linux” 9.3. Regiões de Memória; 16,2. Mapeamento de Memória

“Entendendo o Gerenciador de Memória Virtual do Linux” 4.4 Regiões de Memória

O mapeamento de memory não é usado apenas para mapear arquivos na memory, mas também é uma ferramenta para solicitar RAM do kernel. Estas são as inputs do inode 0 – sua pilha, heap, segmentos bss e mais

Por favor verifique: http://man7.org/linux/man-pages/man5/proc.5.html

 address perms offset dev inode pathname 00400000-00452000 r-xp 00000000 08:02 173521 /usr/bin/dbus-daemon 

O campo de endereço é o espaço de endereço no processo que o mapeamento ocupa.

O campo perms é um conjunto de permissions:

  r = read w = write x = execute s = shared p = private (copy on write) 

O campo offset é o offset no arquivo / whatever;

dev é o dispositivo (maior: menor);

inode é o inode nesse device.0 indica que nenhum inode está associado à região de memory, como seria o caso do BSS (dados não inicializados).

O campo do nome do caminho geralmente será o arquivo que está fazendo o mapeamento. Para arquivos ELF, você pode coordenar facilmente com o campo de deslocamento olhando o campo Deslocamento nos headers do programa ELF (readelf -l).

No Linux 2.0, não há campo que forneça o nome do caminho.