Kann ich jede Seite im Adressraum eines Linux-Prozesses mit einem Schreibschutz versehen?

Ich frage mich, ob es eine Möglichkeit gibt, jede Seite im Adressraum eines Linux-Prozesses schreibgeschützt zu machen (innerhalb des Prozesses selbst übermprotect()). Mit "jede Seite" meine ich wirklich jede Seite des Adressraums des Prozesses, auf die ein gewöhnliches Programm im Benutzermodus schreiben könnte - also der Programmtext, die Konstanten, die Globalen und der Heap - aber ich Ich würde mich nur über Konstanten, Globale und Haufen freuen. Ich möchte den Stack nicht mit einem Schreibschutz versehen - das scheint eine schlechte Idee zu sein.

Ein Problem ist, dass ich nicht weiß, wo ich mit dem Schreibschutz des Speichers beginnen soll. Anschauen/proc/pid/maps, das die Speicherbereiche anzeigt, die für eine bestimmte PID verwendet werden. Sie scheinen immer mit der Adresse @ zu beginne0x08048000, mit dem Programmtext. (Soweit ich das beurteilen kann, ist in Linux der Speicher eines Prozesses mit dem Programmtext unten angeordnet, dann mit Konstanten darüber, dann mit Globals, dann mit dem Heap und dann mit einem Leerraum unterschiedlicher Größe, je nach Größe des Heaps oder Stapels, und dann wächst der Stapel von der Spitze des Speichers an der virtuellen Adresse0xffffffff.) Es gibt eine Möglichkeit festzustellen, wo sich die Spitze des Heaps befindet (indem Sie @ aufrufensbrk(0), das einfach einen Zeiger auf die aktuelle "Unterbrechung" zurückgibt, d. h. den oberen Teil des Heapspeichers, aber nicht wirklich einen Weg, um festzustellen, wo der Heapspeicher beginnt.

Wenn ich versuche, alle Seiten vor @ zu schütz0x08048000 bis zur Pause bekomme ich irgendwann einmprotect: Cannot allocate memory Error. Ich weiß nicht warummprotect würde sowieso Speicher zuweisen - und Google ist nicht sehr hilfreich. Irgendwelche Ideen

Übrigens, der Grund, warum ich dies tun möchte, ist, dass ich eine Liste aller Seiten erstellen möchte, auf die während eines Programmlaufs geschrieben wird, und ich kann mir vorstellen, dies zu tun, indem ich schreibgeschützt bin Lassen Sie alle Seiten versuchten Schreibvorgänge einen Schreibfehler verursachen, implementieren Sie dann einen Schreibfehler-Handler, der die Seite zur Liste hinzufügt und dann den Schreibschutz entfernt. Ich denke, ich kann den Handler implementieren, wenn ich nur herausfinden könnte, welche Seiten geschützt werden sollen und wie.

Vielen Dank

Antworten auf die Frage(4)

Ihre Antwort auf die Frage