Чтение файла ELF после сброса кешей

У меня есть поддерживающее eMMC устройство для разработки приложений для Android 3.10 (Android), и я пытаюсь лучше понять, когда Linux действительно читает из eMMC, а не к кешу страницы. В частности, меня интересует процесс загрузки ELF, и я не могу объяснить следующие результаты.

Я поместил файл ELF в файловую систему, которая запускается init и не выходит. Данные файла ELF находятся в блоках 0x22d930-0x22da78, и я модифицировал ядро ​​для регистрации любых запросов на чтение eMMC для блокировки блоков. Во время загрузки журнал показывает, что весь файл ELF считывается из eMMC.

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

Это имеет смысл для меня, так как я ожидал бы, что полный ELF будет считаться с eMMC, когда init сначала использует fork / execve ELF (0x20 + 0x88 + 0xa0 = 0x22da78 – 0x22d930).

Моя путаница возникает, когда я бросаю кеш страниц и убиваю свой процесс. Когда я убью свой процесс, init настроен на автоматический перезапуск процесса через другую fork / execve. Отбросив кеш страниц, я бы ожидал, что полный ELF снова будет прочитан из eMMC. Тем не менее, я вижу только частичные обращения к чтению eMMC после выдачи следующей команды.

 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 

Мой процесс успешно перезапущен с новым pid, но я не могу понять, почему Linux не перечитывал полный ELF с диска? Linux даже не перечитывает заголовок ELF, который, как я знаю, является первым файлом, прочитанным execve.

Являются ли части исходного сопоставления файлов из моего первоначального процесса еще в кеше / ОЗУ? Следующая команда показывает только мой процесс.

 lsof | grep <ELF name> 

Я был бы признателен за любую помощь в объяснении этого поведения и в том, что моя предполагаемая логика виновата.

One Solution collect form web for “Чтение файла ELF после сброса кешей”

Кажется, что проблема заключается в синхронизации между перезапуском процесса и отбрасыванием кэша страниц. Вместо того, чтобы выдать kill -9 <pid> && echo 3 > /proc/sys/vm/drop_caches , правильная последовательность выглядит следующим образом.

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

Как только служба остановлена, сопоставление файлов больше не блокируется в кеше страниц и теперь можно отбросить. Это заставляет Linux перечитать ELF с диска, когда служба запускается снова.

  • NFS Server - VFS: достигнут максимальный лимит файлов
  • Сколько контроля над конкретными файловыми системами над кешем inode VFS и кешем буфера?
  • Как временно извлечь флешку или жесткий диск в Linux?
  • Инструмент для сброса суперблока Linux VFS
  • Linux и Unix - лучшая ОС в мире.