Kann eine Anwendung Speicher explizit festschreiben und freigeben?

Kann eine Anwendung Speicher explizit festschreiben und freigeben?

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 meinenVirtualAllocUndFreunde. 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-protectorusw. und die verschiedenen -fsanitizeOptionen).

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.

verwandte Informationen