malloc in einem eingebetteten System ohne Betriebssystem

8

Diese Abfrage bezieht sich auf die Speicherzuweisung mit malloc .

Im Allgemeinen sagen wir, dass malloc Speicher von Heap zuweist.

Nun sage ich, ich habe ein einfaches embedded System (kein Betriebssystem), ich habe normales Programm geladen, wo ich malloc in meinem Programm mache.

In diesem Fall wo ist der Speicher zugewiesen?

    
Leo Messi 17.02.2012, 20:30
quelle

3 Antworten

9

malloc () ist eine Funktion, die normalerweise von der Laufzeitbibliothek implementiert wird. Sie haben recht, wenn Sie auf einem Betriebssystem laufen, dann wird malloc manchmal (aber nicht jedes Mal) einen Systemaufruf auslösen, bei dem das OS Speicher in den Adressraum Ihres Programms mappt.

Wenn Ihr Programm ohne Betriebssystem ausgeführt wird, können Sie sich Ihr Programm als das Betriebssystem vorstellen. Sie haben Zugriff auf alle Adressen, dh Sie können einem Zeiger nur eine Adresse zuweisen und dann den Zeiger auf Lesen / Schreiben zurücksetzen.

Natürlich müssen Sie sicherstellen, dass nicht andere Teile Ihres Programms den gleichen Speicher benutzen, also schreiben Sie Ihren eigenen Speicher-Manager:

Um es einfach auszudrücken: Sie können eine Reihe von Adressen, die Ihr "memory-manager" verwendet, um zu speichern, welche Adressbereiche bereits verwendet werden (die darin gespeicherten Datenstrukturen können als einfach wie eine verkettete Liste oder viel viel komplexer). Dann schreiben Sie eine Funktion und nennen sie z. malloc () , das den funktionalen Teil Ihres Speichermanagers bildet. Es untersucht die angegebene Datenstruktur, um eine Adresse von Bereichen zu finden, die so lange ist, wie das Argument angibt, und gibt einen Zeiger darauf zurück.

Wenn jetzt jede Funktion in Ihrem Programm Ihren malloc () aufruft, anstatt nach dem Zufallsprinzip in benutzerdefinierte Adressen zu schreiben, haben Sie den ersten Schritt getan. Sie können eine free () -Funktion schreiben, die nach dem Zeiger in der erwähnten Datenstruktur sucht und die Datenstruktur anpasst (in der naiven Linked-List würde sie zwei Links zusammenführen).

    
Bernd Elkemann 17.02.2012, 20:47
quelle
5

Die einzige wirkliche Antwort ist "Wo auch immer Ihre Compiler / Bibliothek-Implementierung es setzt".

Im eingebetteten System, das ich verwende, gibt es keinen Heap, da wir keinen geschrieben haben.

    
jkerian 17.02.2012 20:33
quelle
4

Vom Haufen wie du sagst. Der Unterschied besteht darin, dass der Heap nicht vom Betriebssystem bereitgestellt wird. Das Linker-Skript Ihrer Anwendung enthält ohne Zweifel eine Zuweisung für den Heap. Die Laufzeitbibliothek wird dies verwalten.

Im Fall der Newlib C-Bibliothek, die oft in GCC-basierten eingebetteten Systemen verwendet wird, die kein Betriebssystem ausführen oder zumindest kein Linux ausführen, Die Bibliothek verfügt über eine stub syscall -Funktion namens sbrk (). Es ist die Verantwortlichkeit des Entwicklers, sbrk () zu implementieren, das auf Anfrage dem Heap-Manager mehr Speicher zur Verfügung stellen muss. Typischerweise inkrementiert es lediglich einen Zeiger und gibt einen Zeiger auf den Anfang des neuen Blocks zurück, danach verwaltet und pflegt der Heap-Manager der Bibliothek den neuen Block, der mit vorhergehenden Blöcken oder nicht zusammenhängend sein kann. Der vorherige Link enthält eine Beispielimplementierung.

    
Clifford 17.02.2012 22:16
quelle

Tags und Links