
Ist es möglich, von einer Anwendung aus das Festschreiben von Speicherseiten explizit zu steuern? In einer Windows-Anwendung habe ich vor vielen Jahren einen Heap-Manager mit „Alarmsystem“ geschrieben, der mir dabei helfen sollte, einen zufälligen Fehler in Bezug auf hängende Referenzen/Heap-Beschädigungen zu finden. Ich konnte einen großen Bereich des virtuellen Speichers reservieren und dann Seiten nach Belieben festschreiben/freigeben. Die Idee war damals, einen Satz zu erstellen, der eine nicht festgeschriebene Seite enthält, gefolgt von einer oder mehreren festgeschriebenen Seiten (ausreichend, um die Anforderung zu erfüllen), gefolgt von einer weiteren nicht festgeschriebenen Seite; mit einem Flag zur Kompilierungszeit, das steuert, ob der an den Aufrufer zurückgegebene Zeiger am Anfang oder am Ende des festgeschriebenen Bereichs steht (um bei einem Unterschreiben bzw. Überschreiben sofort eine Ausnahme auszulösen). Windows bietet eine API zum Reservieren von Speicherbereichen und Festschreiben von Seiten. Ich habe eine weitere Verwendung für einen solchen Buchendenpuffer in einem Linux-Programm, das ich schreibe, und ich frage mich, ob der Kernel dieselbe Art von Funktionalität bietet.
Antwort1
Ich nehme an, Sie meinenVirtualAlloc
UndFreunde. Soweit ich weiß, gibt es in Linux kein direktes Äquivalent, aber Sie können den gleichen Effekt auf verschiedene Weise erzielen. Wenn Sie Speicher reservieren möchten, können Sie Folgendes verwenden:mmap(2)
; um es festzuschreiben, müssen Sie darauf schreiben; um es freizugeben, können Sie verwendenmadvise(2)
'S MADV_DONTNEED
.
Um Schutzseiten zu implementieren, finden Sie möglicherweisemprotect(2)
zusammen mit einem Handler eine bessere Option zu sein SIGSEGV
. Sie können sich auch den Überlaufschutz ansehen, den Ihr Compiler bietet ( -fstack-protector
usw. und die verschiedenen -fsanitize
Optionen).
Antwort2
Wenn Sie einfach nur Ihre eigenen Programme debuggen möchten, anstatt einen komplizierten Speichermanager zu implementieren, empfehle ich Ihnen, einfach ein Programm wievalgrindum Speicherlecks und hängende Zeiger zu erkennen.