Estou tentando entender o uso de memória do meu aplicativo Linux incorporado. O /proc/pid/maps
utilitá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.
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óriaRespostas:
Cada linha
/proc/$PID/maps
descreve uma região de memória virtual contígua em um processo ou encadeamento. Cada linha possui os seguintes campos:-
aparecerá em vez dor
/w
/x
. Se uma região não é compartilhada , é privada , portanto, umap
aparecerá em vez de umas
. 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 amprotect
chamada do sistema.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.[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,
mmap
mas 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.fonte
gpm
está 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?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
fonte
Por favor, verifique: http://man7.org/linux/man-pages/man5/proc.5.html
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:
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.
fonte