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

156

Estou tentando entender o uso de memória do meu aplicativo Linux incorporado. O /proc/pid/mapsutilitário / arquivo parece ser um bom recurso para ver os detalhes. Infelizmente não entendo todas as colunas e entradas.

O que significam as entradas anônimas do inode 0? Estes parecem ser alguns dos maiores segmentos de memória.

simon
fonte
1
proc(5) mmap(2)"Compreendendo o kernel do Linux" 9.3. Regiões de memória; 16.2 Mapeamento de memória "Entendendo o Gerenciador de Memória Virtual Linux" 4.4 regiões de memória
wRAR

Respostas:

263

Cada linha /proc/$PID/mapsdescreve uma região de memória virtual contígua em um processo ou encadeamento. Cada linha possui os seguintes campos:

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
  • endereço - este é o endereço inicial e final da região no espaço de endereço do processo
  • permissões - descreve como as páginas da região podem ser acessadas. Existem quatro permissões diferentes: ler, escrever, executar e compartilhar. Se a leitura / gravação / execução estiver desativada, um -aparecerá em vez do r/ w/ x. Se uma região não é compartilhada , é privada , portanto, uma paparecerá em vez de uma s. Se o processo tentar acessar a memória de uma maneira que não é permitida, uma falha de segmentação será gerada. As permissões podem ser alteradas usando a mprotectchamada do sistema.
  • deslocamento - Se a região foi mapeada a partir de um arquivo (usando mmap), esse é o deslocamento no arquivo em que o mapeamento começa. Se a memória não foi mapeada a partir de um arquivo, é apenas 0.
  • device - Se a região foi mapeada a partir de um arquivo, esse é o número do dispositivo principal e secundário (em hexadecimal) em que o arquivo está localizado.
  • inode - Se a região foi mapeada a partir de um arquivo, este é o número do arquivo.
  • nome do caminho - Se a região foi mapeada a partir de um arquivo, este é o nome do arquivo. Este campo está em branco para regiões mapeadas anônimas. Há também regiões especiais com nomes como [heap], [stack]ou [vdso]. [vdso]significa objeto compartilhado dinâmico virtual. É usado pelas chamadas do sistema para alternar para o modo kernel.Aqui está um bom artigo: "O que é o linux-gate.so.1?"

Você pode perceber muitas regiões anônimas. Geralmente são criados por, mmapmas não estão anexados a nenhum arquivo. Eles são usados ​​para várias coisas diversas, como memória compartilhada ou buffers não alocados no heap. Por exemplo, acho que a biblioteca pthread usa regiões mapeadas anônimas como pilhas de novos threads.

Jay Conrod
fonte
4
Sim, os pthreads estão alocando blocos de 8Mb para uma pilha com uma seção menor para detecção de estouro de pilha (eu acho). Portanto, cada pthread criado, por padrão, aloca uma região de memória inode 0 de 8Mb e uma região inode 0 de 4Kb.
simon
Então, no seu exemplo, gpmestá mapeando o arquivo binário em algum endereço virtual desde o início, com o cabeçalho ELF etc.? O carregador não deve analisar o cabeçalho ELF e mapear seções individuais, não o arquivo inteiro?
Dmitry Grigoryev 23/09
9

O mapeamento de memória não é usado apenas para mapear arquivos na memória, mas também é uma ferramenta para solicitar RAM do kernel. Essas são as entradas do inode 0 - sua pilha, heap, segmentos bss e mais

Xeor
fonte
5

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 permissões:

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

O campo de deslocamento é o deslocamento no arquivo / qualquer que seja;

dev é o dispositivo (principal: menor);

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

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

No Linux 2.0, não há campo que dê o nome do caminho.

cahit beyaz
fonte