Ich schreibe einen Kernel und brauche (und möchte) mehrere Stapel und Haufen in den virtuellen Speicher, aber ich kann nicht herausfinden, wie man sie effizient platziert. Wie machen normale Programme das?Wo sind mehrere Stapel und Haufen im virtuellen Speicher?
Wie (oder wo) werden Stacks und Heaps in den begrenzten virtuellen Speicher eines 32-Bit-Systems platziert, sodass sie so viel Platz wie möglich haben?
Wenn zum Beispiel ein triviales Programm in den Speicher geladen wird, kann das Layout der Adressraum wie folgt aussehen:
[ Code Data BSS Heap-> ... <-Stack ]
In diesem Fall wird der Haufen so groß wachsen können als virtuelle Speicher ermöglicht (zB bis zum Stack), und ich glaube, so funktioniert der Heap für die meisten Programme. Es gibt keine vordefinierte obere Grenze.
Viele Programme haben gemeinsam genutzte Bibliotheken, die sich irgendwo im virtuellen Adressraum befinden. Dann gibt es Multi-Thread-Programme, die mehrere Stapel haben, einen für jeden Thread. Und .NET-Programme haben multiple heaps, die alle in der Lage sein müssen, auf die eine oder andere Weise zu wachsen.
Ich sehe einfach nicht, wie dies einigermaßen effizient getan wird, ohne ein vordefiniertes Limit für die Größe aller Haufen und Stapel.
Das Wechseln zwischen Threads sollte jedoch nicht den gesamten Adressraum (und das Leeren des TLB) ändern. Daher muss für jeden von einem Prozess verwendeten Thread sein Stack _must_ im Adressraum des Prozesses vorhanden sein. Und der Link in meinem Beitrag zeigt ein Bild davon, wie ein CLR-Prozess sehr viele Haufen hat. Es gibt also einen Bedarf für mehr als einen Stapel und Heap in einem Adressraum. – Virtlink
Der Adressraum ist eine sehr unterschiedliche Abstraktionsebene. Tatsächlich haben Sie in diesem Fall diese mehreren Stacks und Heaps im selben Adressraum. Der Adressraum selbst wird vom Betriebssystem verwaltet, der Heap hingegen nicht; Es wird vom Bibliothekscode auf Benutzerebene verwaltet. – Powerslave