Por que um arquivo é listado em intervalos sereval em / proc / pid / smaps?

2

Quando eu cat / proc / 1 / smaps arquivo descobri que libs têm frequentemente até 4 mapeamentos com tamanhos diferentes e diferentes Rss / Pss etc:

7f1a09696000-7f1a0982f000 r-xp 00000000 fe:04 1313975                    /usr/lib/libc-2.21.so
Size:               1636 kB
Rss:                 980 kB
Pss:                   9 kB
Shared_Clean:        980 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:          980 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd ex mr mw me 
7f1a0982f000-7f1a09a2e000 ---p 00199000 fe:04 1313975                    /usr/lib/libc-2.21.so
Size:               2044 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: mr mw me 
7f1a09a2e000-7f1a09a32000 r--p 00198000 fe:04 1313975                    /usr/lib/libc-2.21.so
Size:                 16 kB
Rss:                  16 kB
Pss:                  14 kB
Shared_Clean:          0 kB
Shared_Dirty:          4 kB
Private_Clean:        12 kB
Private_Dirty:         0 kB
Referenced:           12 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd mr mw me ac 
7f1a09a32000-7f1a09a34000 rw-p 0019c000 fe:04 1313975                    /usr/lib/libc-2.21.so
Size:                  8 kB
Rss:                   8 kB
Pss:                   8 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         8 kB
Referenced:            8 kB
Anonymous:             8 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac 

Alguém pode me dizer por que ou apontar um artigo?

    
por KaP 14.06.2015 / 00:32

1 resposta

6

Em geral, as bibliotecas possuem três tipos diferentes de memória carregados do arquivo. Estes são:

  • code - O código executável real na biblioteca
  • rodata - Dados somente leitura (valores constantes).
  • data - dados graváveis.

Estes são mapeados com permissões diferentes. Se você olhar a primeira linha de cada mapeamento:

7f1a09696000-7f1a0982f000 r-xp 00000000 fe:04 1313975                    /usr/lib/libc-2.21.so
7f1a0982f000-7f1a09a2e000 ---p 00199000 fe:04 1313975                    /usr/lib/libc-2.21.so
7f1a09a2e000-7f1a09a32000 r--p 00198000 fe:04 1313975                    /usr/lib/libc-2.21.so
7f1a09a32000-7f1a09a34000 rw-p 0019c000 fe:04 1313975                    /usr/lib/libc-2.21.so

A segunda coluna da tabela contém as permissões para cada bloco mapeado. O primeiro bloco tem as permissões r-xp . Este é o bloco de código e, portanto, é legível e executável.

O segundo bloco tem ---p . Este bloco não está acessível. Ele provavelmente contém símbolos de depuração ou outros dados que não são realmente necessários para executar o programa.

O terceiro bloco tem r--p . Este é o segmento de dados somente leitura. O último bloco tem rw-p . Este é o segmento de dados graváveis.

A razão para os diferentes valores de Rss e Pss, etc. é simplesmente devido às diferentes quantidades de memória acessadas em cada região.

Se você está curioso sobre os significados dos vários campos, dê uma olhada na seção /proc/[pid]/smaps no proc man page . A linha de cabeçalho de cada seção é documentada na seção /proc/[pid]/maps .

    
por 14.06.2015 / 01:02

Tags