La saleté des pages d’un mmap peut-elle être trouvée dans l’espace utilisateur?

Peut-on accéder à la saleté des pages d’un fichier mmap (non partagé) depuis l’espace utilisateur sous Linux 2.6.30+? Les hacks et les kludges spécifiques à la plate-forme sont les bienvenus.

Idéalement, je cherche un tableau de bits, un par page (4 ko?) De la région mmap’ed, qui est défini si cette page a été écrite depuis que la région a été créée.

(Je sais que le processus d’écriture pourrait garder une trace de ces informations – mais cela semble idiot de le faire si le kernel le fait de toute façon.)

Merci,

Chris.

Voir les interfaces / proc / * / pagemap et / proc / kpageflags. Tout d’abord, vous indique une adresse pour PFN, la seconde vous indique le bit incorrect donné à PFN.

Voir fs / proc / task_mmu.c, Documentation / vm / pagemap.txt, Documentation / vm / page-types.c.

La solution traditionnelle consiste à protéger contre la lecture uniquement, puis à gérer le symbole sigsegv et le marquage sale avant de procéder à la reprotection pour autoriser les écritures. Nous l’avons fait à ObjectStore il y a longtemps à cette fin.

generic_writepages et balance_dirty_pages_ratelimited_nr semblent être les points d’entrée dans le kernel (2.6.20) liés aux pages modifiées. J’espère qu’ils travaillent aussi dans 2.6.30+. Question intéressante, puis-je demander ce que vous écrivez qui nécessite un tel contrôle sur les pages?

Ces données seraient continuellement obsolètes – il est possible que la page soit réécrite après que votre processus voit que la page est sale.

Cela dit, le ton consiste à le mapper en morceaux d’une page, puis à regarder /proc/pid/smaps pour voir si les morceaux sont sales – cela peut échouer si le kernel fusionne les pages.

Malheureusement, étant donné que les tables de pages ne sont pas visibles par le processus d’espace utilisateur, c’est à peu près tout ce que vous pouvez faire sans un patch de kernel quelconque.

Si votre tableau de bits est suffisamment petit, vous pouvez peut-être utiliser les registres de débogage sur Intel (bien que je ne sois pas sûr de la façon dont cela est fait sur Linux).