2010-06-17 4 views
13

Kann die Verschmutzung von Seiten eines (nicht freigegebenen) mmap von Userspace unter Linux 2.6.30+ zugegriffen werden? Plattformspezifische Hacks und Kludges sind willkommen.Kann die Verschmutzung von Seiten eines mmap vom Benutzer gefunden werden?

Idealerweise suche ich nach einem Array von Bits, eines pro Seite (4kB?) Des mmap-Bereichs, die gesetzt werden, wenn auf diese Seite geschrieben wurde, seit die Region mmapiert wurde.

(Ich bin mir bewusst, dass der Prozess des Schreibens tun Spur dieser Informationen halten konnte - aber es scheint dumm, so zu tun, wenn der Kernel es trotzdem tut.)

Danke,

Chris.

Antwort

10

Siehe/proc/*/pagemap und/proc/kpageflags Schnittstellen. Zuerst sagt Ihnen PFN für eine Adresse, die zweite sagt Ihnen schmutziges Bit gegeben PFN.

Weitere Informationen finden Sie unter fs/proc/task_mmu.c, Dokumentation/vm/pagemap.txt, Documentation/vm/page-types.c.

2

generic_writepages und balance_dirty_pages_ratelimited_nr scheinen die Einstiegspunkte in den Kernel (2.6.20), die mit schmutzigen Seiten verwandt sind. Ich hoffe, dass sie auch in 2.6.30+ arbeiten. Interessante Frage, kann ich fragen, was Sie schreiben, das eine solche Kontrolle über die Seiten erfordert?

+0

Danke, ich werde mich mit generic_writepages befassen. Ich habe mich nur gefragt, ob mmap als grobkörniges pseudo-STM-System missbraucht werden könnte. Es kann sein, dass die existierenden STM-Systeme das schon tun, ich werde einen Code durchgehen müssen, wenn ich eine Minute habe. – fadedbee

+0

Diese sind dem Benutzerraum nicht richtig ausgesetzt? –

4

Die traditionelle Lösung besteht darin, nur zu lesen, und dann behandeln Sie die Sigsegv und markieren Sie schmutzig vor dem erneuten Beschreiben, um Schreibvorgänge zu ermöglichen. Das haben wir zu diesem Zweck schon lange bei ObjectStore gemacht.

+0

Geben Sie ein Beispiel dafür, wie Sie SIGSEGV zu diesem Zweck behandeln und wiederherstellen. –

+0

Welcher Teil von 'Sigaction' und 'Mprotect' erscheint Ihnen schwierig? – bmargulies

+1

Das OP weiß, dass es auf diese Weise möglich ist, aber er möchte diesen Overhead vermeiden. – pythonic

0

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).

1

Diese Daten würden ständig veraltet sein - es ist möglich, dass die Seite zurückgeschrieben wird, nachdem Ihr Prozess die Seite schmutzig sieht.

Das heißt, Ton Weg ist es in einer Seite Brocken zuordnen, dann sehen Sie /proc/pid/smaps um zu sehen, ob die Chunks schmutzig sind - das sagte, kann dies fehlschlagen, wenn der Kernel die Seiten zusammenführt.

Leider, da die Seitentabellen für den Benutzerraumprozess nicht sichtbar sind, ist das das Beste, was Sie ohne einen Kernel-Patch irgendeiner Art tun können.