Kann die Verschmutzung von Seiten einer mmap aus dem Userspace gefunden werden?
Lesezeit: 2 Minuten
verblasste Biene
Kann unter Linux 2.6.30+ vom Userspace aus auf die Verschmutzung von Seiten einer (nicht freigegebenen) mmap zugegriffen werden? Plattformspezifische Hacks und Kludges sind willkommen.
Im Idealfall suche ich nach einem Array von Bits, eines pro Seite (4 kB?) der Mmap-Region, die gesetzt werden, wenn auf diese Seite geschrieben wurde, seit die Region Mmap’ed wurde.
(Mir ist bewusst, dass der Prozess, der das Schreiben durchführt, diese Informationen verfolgen könnte – aber es scheint albern, dies zu tun, wenn der Kernel dies sowieso tut.)
Vielen Dank,
Chris.
Siehe /proc/*/pagemap und /proc/kpageflags-Schnittstellen. Erstens sagt Ihnen PFN für eine Adresse, zweitens sagt Ihnen Dirty Bit PFN gegeben.
Die traditionelle Lösung besteht darin, mprotect nur zum Lesen zu verwenden und dann sigsegv zu behandeln und als schmutzig zu markieren, bevor der Schutz erneut ausgeführt wird, um Schreibvorgänge zuzulassen. Genau aus diesem Grund haben wir das bei ObjectStore vor langer Zeit getan.
Bitte geben Sie ein Beispiel, wie Sie zu diesem Zweck mit SIGSEGV umgehen und sich von ihm erholen.
– Matt Tischler
8. Dezember 2011 um 9:50 Uhr
Welcher Teil von „sigaction“ und „mprotect“ erscheint Ihnen schwierig?
– bmargulies
9. Dezember 2011 um 14:14 Uhr
Das OP weiß, dass dies auf diese Weise möglich ist, möchte diesen Overhead jedoch vermeiden.
– pythonisch
23. April 2012 um 17:00 Uhr
generische_schreibseiten und balance_dirty_pages_ratelimited_nr scheinen die Einstiegspunkte in den Kernel (2.6.20) zu sein, die sich auf schmutzige Seiten beziehen. Ich hoffe, sie funktionieren auch in 2.6.30+. Interessante Frage, darf ich fragen, was Sie schreiben, das eine solche Kontrolle über die Seiten erfordert?
Danke, ich werde einen Blick auf die Verwendung von generic_writepages werfen. Ich habe mich nur beiläufig gefragt, ob mmap als grobkörniges Pseudo-STM-System missbraucht werden könnte. Es kann sein, dass die bestehenden STM-Systeme das bereits tun, ich muss etwas Code durchgehen, wenn ich eine Minute Zeit habe.
– verblasste Biene
17. Juni 2010 um 12:17 Uhr
Diese Daten wären ständig veraltet – es ist möglich, dass die Seite zurückgeschrieben wird, nachdem Ihr Prozess feststellt, dass die Seite fehlerhaft ist.
Das heißt, der Tonweg besteht darin, es in Blöcken von einer Seite abzubilden und es sich dann anzusehen /proc/pid/smaps um zu sehen, ob die Chunks schmutzig sind – das kann allerdings fehlschlagen, wenn der Kernel die Seiten zusammenführt.
Da die Seitentabellen für den Benutzerbereichsprozess nicht sichtbar sind, ist dies leider das Beste, was Sie ohne einen Kernel-Patch tun können.
Wenn Ihr Array von Bits klein genug ist, können Sie vielleicht die Debug-Register auf Intel verwenden (obwohl ich nicht sicher bin, wie es unter Linux gemacht wird).
14323900cookie-checkKann die Verschmutzung von Seiten einer mmap aus dem Userspace gefunden werden?yes