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.