Lendo arquivo ELF depois de colocar caches

1

Eu tenho um dispositivo de desenvolvimento Linux 3.10 suportado pelo eMMC (Android) e estou tentando entender melhor quando o Linux está realmente lendo do eMMC em vez do cache de páginas. Especificamente, estou interessado no processo de carregamento do ELF e não posso explicar os seguintes resultados.

Eu coloquei um arquivo ELF no sistema de arquivos que é executado pelo init e não sai. Os dados do arquivo ELF residem em blocos 0x22d930-0x22da78 e modifiquei o kernel para registrar quaisquer acessos de leitura do eMMC para bloquear blocos desse tipo. Durante a inicialização, o log mostra que o arquivo ELF inteiro é lido no eMMC.

mmc read block: 0x22d930, num_blocks: 0x20
mmc read block: 0x22d9f0, num_blocks: 0x88
mmc read block: 0x22d950, num_blocks: 0xa0

Isso faz sentido para mim, como eu esperaria que o ELF completo fosse lido a partir do eMMC quando o primeiro fork do primeiro fork / execve é o ELF (0x20 + 0x88 + 0xa0 = 0x22da78 - 0x22d930).

Minha confusão surge quando eu derrubo o cache de páginas e mato o meu processo. Quando eu mato o meu processo, o init é configurado para reiniciar automaticamente o processo através de outro fork / execve. Ao descartar o cache da página, esperaria que o ELF completo fosse novamente lido no eMMC. No entanto, vejo apenas acessos parciais de leitura do eMMC após a emissão do seguinte comando.

echo 3 > /proc/sys/vm/drop_caches && kill -9 <pid>

mmc read block: 0x22d960, num_blocks: 0x10
mmc read block: 0x22d988, num_blocks: 0x8
mmc read block: 0x22d9a0, num_blocks: 0x8
mmc read block: 0x22d9c0, num_blocks: 0x40
mmc read block: 0x22da40, num_blocks: x018
mmc read block: 0x22da60, num_blocks: 0x18

Meu processo foi reiniciado com sucesso com um novo pid, mas não consigo entender por que o Linux não releu o ELF completo do disco? O Linux nem mesmo releu o cabeçalho ELF, que eu sei que é o primeiro arquivo lido por execve.

As partes do mapeamento de arquivo original do meu processo original ainda estão em algum cache / RAM? O comando a seguir mostra apenas o meu processo.

lsof | grep <ELF name>  

Eu gostaria de receber ajuda para explicar esse comportamento e onde minha lógica percebida está em falta.

    
por bangelo 23.04.2015 / 21:01

1 resposta

0

O problema parece ser o tempo entre o init reiniciar o processo e o cache da página ser descartado. Em vez de emitir kill -9 <pid> && echo 3 > /proc/sys/vm/drop_caches , a seqüência correta parece ser a seguinte.

stop <service>
echo 3 > /proc/sys/vm/drop_caches
start <service>

Quando o serviço for interrompido, o mapeamento de arquivos não estará mais bloqueado no cache de páginas e poderá ser descartado. Isso força o Linux a reler o ELF do disco quando o serviço for iniciado novamente.

    
por 30.04.2015 / 16:17

Tags