Frage

Ich arbeite den Kernel auf die Gestaltung (was ich werde tatsächlich den „Kern“ nennen, nur anders zu sein, aber es ist im Grunde das gleiche) für ein OS ich arbeite. Die Besonderheiten des OS selbst sind irrelevant, wenn ich nicht Multitasking, Speicherverwaltung und andere grundlegende Dinge zum Laufen bekommen, also muss ich zuerst daran arbeiten. Ich habe einige questinos über eine malloc Routine zu entwerfen.

Ich vermute, dass malloc () ist entweder ein Teil des Kernels zu gehen selbst (Ich bin in diese Richtung gelehnt) oder ein Teil des Programms, aber ich bin zu haben, meine eigene Implementierung des C zu schreiben Standardbibliothek oder so, so erhalte ich eine malloc zu schreiben. Meine Frage ist in dieser Hinsicht eigentlich ziemlich einfach, wie funktioniert C (oder C ++) seine Heap verwalten?

Was habe ich immer in theorey Klassen unterrichtet worden ist, dass der Haufen ein stetig wachsender Teil des Speichers ist, an einer bestimmten Adresse beginnen, und in vielen Sinne wie ein Stapel verhalten. Auf diese Weise weiß ich, dass in globalem Bereich deklarierte Variablen am Anfang ist, und mehr Variablen „geschoben“ auf den Haufen, als sie in ihren jeweiligen Bereichen deklariert sind, und Variablen, die den Gültigkeitsbereich verlassen wird einfach im Speicherraum links, aber, dass der Raum als frei markiert, so kann der Heap mehr erweitern, wenn sie muss.

Was muss ich wissen, ist, wie auf der Erde hat C einen dynamisch wachsenden Haufen auf diese Weise tatsächlich umgehen? Ist eine kompilierte C-Programm seine eigenen Anrufe an eine malloc Routine machen und seinen eigenen Haufen handhaben, oder muss ich es mit einem automatisch expandierenden Raum zur Verfügung stellen müssen? Auch wie funktioniert das C-Programm, wo der Heap beginnt?

Oh, und ich weiß, dass die gleichen Konzepte auf andere Sprachen anwenden, aber ich möchte keine Beispiele in C / C ++ sein, weil ich mit dieser Sprache bequemste bin. Ich möchte auch nicht über andere Dinge kümmern, wie der Stapel, wie ich glaube, ich bin in der Lage, Dinge wie diese auf eigene Faust zu behandeln.

So nehme ich an meiner eigentliche Frage ist, anders als malloc / free (die Griffe bekommen und zu befreien Seiten für mich selbst, usw.) ist ein Programm benötigt das Betriebssystem, etwas anderes zu bieten?

Danke!

EDIT Ich bin mehr daran interessiert, wie C malloc im Zusammenhang mit dem Heap verwendet als in dem tatsächlichen Funktionsweise der malloc Routine selbst. Wenn es hilft, tue ich dies auf x86, aber C ist Cross-Compiler, so dass es sollte keine Rolle spielen. ^ _ ^

EDIT WEITERE: Ich verstehe, dass ich Begriffe verwirrt werden kann. Mir wurde beigebracht, dass die „Halde“ war, wo das Programm gespeichert Dinge wie global / lokale Variablen. Ich bin für den Umgang mit einem „Stapel“ in Assembler-Programmierung verwendet wird, und ich erkennen, dass ich meine wahrscheinlich, dass statt. Ein wenig Recherche auf meinem Teil zeigt, dass „Haufen“ wird häufiger auf den gesamten Speicher zu verweisen, dass ein Programm für mich selbst zugewiesen hat, oder die Gesamtzahl (und Reihenfolge) von Seiten des Speichers des O zur Verfügung gestellt hat.

Also, in diesem Sinne, wie gehe ich mit einem stetig wachsenden Stapel ? (Es scheint, dass meine C Theorie Klasse mild war ... fehlerhaft.)

War es hilfreich?

Lösung

malloc wird in der C-Laufzeit im Userspace, die sich auf spezifische OS-System ruft in den Seiten des virtuellen Speichers abzubilden allgemein umgesetzt. Die Aufgabe der malloc und free ist diese Speicherseiten zu verwalten, die in ihrer Größe festgelegt sind (typischerweise 4 KB, aber manchmal größer), und sie in Stücke zu schneiden und würfeln, die Anwendungen verwenden können.

Siehe zum Beispiel der GNU libc Implementierung.

Für eine viel einfachere Implementierung, überprüfen Sie die MIT-Betriebssysteme aus Klasse von den letzten Jahr. Im Einzelnen finden Sie in der final Labor Handout und einen Blick auf lib/malloc.c nehmen. Dieser Code verwendet das Betriebssystem JOS in der Klasse entwickelt. Das System funktioniert so, dass es durch die Seitentabellen liest (vorausgesetzt schreibgeschützt durch das OS), für nicht zugeordneten virtuellen Adressbereiche suchen. Es verwendet dann die sys_page_alloc und sys_page_unmap Systemaufrufe abzubilden und unmap Seiten in den aktuellen Prozess.

Andere Tipps

Es gibt mehrere Möglichkeiten, das Problem zu lösen.

Am häufigsten C-Programme haben ihre eigenen malloc / free-Funktionalität. Dieser wird für die kleinen Objekten arbeiten. Zu Beginn (und sobald der Speicher erschöpft ist) der Speicher-Manager fragt das Betriebssystem für mehr Speicher. Traditionelle Methoden hierfür sind mmap und sbrk auf dem Unix tun Varianten (GlobalAlloc / LocalAlloc auf Win32).

Ich schlage vor, dass Sie einen Blick auf die Doug Lea Speicherzuordner ( google: dlmalloc) von einem Speicheranbieter (zB OS) Sicht. Das Allocator ist erstklassig in einem sehr gut und hat Haken für alle wichtigen Betriebssystem. Wenn Sie wissen wollen, was eine hohe Leistung allocator von einem OS erwartet ist dieser Code die erste Wahl ist.

Sind Sie die Halde verwirrend und den Stapel?

Ich frage, weil Sie „ein stetig wachs Stück Erinnerung“, Umfang und drückt Variablen auf dem Heap erwähnen, wie sie deklariert sind. Das ist sicher klingt wie Sie sprechen, tatsächlich über den Stapel.

In den häufigsten C-Implementierungen Erklärungen von automatischen Variablen wie

int i;

gehen führen in der Regel in i auf dem Stapel zugeordnet ist. Im Allgemeinen malloc nicht einlassen, wenn Sie es explizit aufrufen oder eine Bibliothek nennen Sie es machen aufruft.

Ich würde empfehlen, bei „Expert C Programming“ von Peter Van Der Linde für Hintergrund betrachten, wie C Programme in der Regel mit dem Stapel arbeiten und dem Heap.

Pflichtlektüre: Knuth - Art of Computer Programming, Band 1, Kapitel 2, Abschnitt 2.5. Andernfalls könnten Sie Kernighan & Ritchie „The C Programming Language“ lesen eine Implementierung zu sehen; oder könnten Sie Plauger "The Standard C Library", um zu sehen eine weitere Implementierung lesen.

Ich glaube, dass das, was Sie tun müssen, um in Ihrem Kern aus etwas anders sein wird, was die Programme außerhalb des Kerns sehen. Insbesondere wird die in-Core-Speicherzuweisung für die Programme mit virtuellen Speicher zu tun haben, usw., während die Programme außerhalb des Codes einfach, die Ergebnisse sehen, was der Kern zur Verfügung gestellt hat.

Lesen Sie mehr über virtuelle Speicherverwaltung (Paging). Es ist sehr CPU-spezifisch, und jedes OS implementiert VM-Management speziell für jede unterstützte CPU. Wenn Sie Ihr Betriebssystem für x86 / amd64 schreiben, lesen ihre jeweiligen Handbücher.

Im Allgemeinen übernimmt die C-Bibliothek die Implementierung von malloc, Speicher aus dem O anfordert (entweder über anonyme mmap oder in älteren Systemen sbrk) als notwendig. So dass Ihre Kernel-Seite der Dinge behandeln sollte ganze Seiten über so etwas wie eine dieser Mittel zugewiesen werden.

Dann ist es bis malloc Speicher in einer Weise, als Almosen zu verteilen, die nicht den freien Speicher zu stark fragmentieren. Ich bin nicht zu au fait mit den Details dieser, obwohl; aber der Begriff Arena in den Sinn kommt. Wenn ich einen Verweis jagen kann, werde ich diesen Beitrag aktualisieren.

Gefahr Gefahr !! Wenn Ihr auch nur zu versuchen Kernel-Entwicklung unter Berücksichtigung, sollten Sie sehr bewusst sein, die Kosten Ihre Ressourcen und ihre relativ begrenzte Verfügbarkeit ...

Eine Sache, über Rekursion, ist, dass es sehr teuer (zumindest im Kernland), du wirst sehen nicht viele Funktionen geschrieben, um einfach unabaided weiter, sonst wird Ihre Kernel Panik.

Zu meinem Punkt unterstreichen hier (bei stackoverflow.com heh), lesen Sie in diesem Beitrag von der NT-Debugging Blog über Kernel-Stack-Überlauf des, specificially,

  

· Auf x86-basierten Plattformen, die   Kernel-Modus-Stack ist 12K .

     

· Auf x64-basierten Plattformen, die   Kernel-Modus-Stack ist 24K . (X64-basierte   Plattformen umfassen Systeme mit   Prozessoren der AMD64 mit   mit Architektur und Prozessoren der   Intel EM64T-Architektur).

     

· Auf Itanium-basierten Plattformen, die   Kernel-Modus-Stack ist 32K mit einem 32K   Hintergrundspeicher.

Das ist wirklich, nicht eine ganze Menge;

  

Die üblichen Verdächtigen

     
     

1. Mit dem Stapel großzügig.

     

2. Aufruf von Funktionen rekursiv.

Wenn Sie das Blog ein bisschen lesen über, werden Sie sehen, wie hart die Kernel-Entwicklung mit einer ziemlich einzigartigen Reihe von Fragen sein kann. Du bist Theorie Klasse war nicht falsch, es war einfach, einfach. ;)

Um von der Theorie zu gehen. -> Kernel-Entwicklung ist in etwa so bezeichnend für ein Kontext Schalter wie möglich ist (vielleicht eine Hypervisor-Interaktion in der Mischung speichern !!)

Wie auch immer, nie davon ausgehen, validieren und Ihre Erwartungen testen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top