Was passiert im Kernel während malloc?

Lesezeit: 4 Minuten

Benutzeravatar von liv2hak
liv2hak

Diese Frage wurde mir in einem Vorstellungsgespräch gestellt. Was sie wissen wollten, war, wenn der Benutzer malloc(4) aufruft, um 4 Bytes Speicher zuzuweisen, wie reagiert das Betriebssystem (Linux)? Welches Subsystem antwortet auf diesen Systemaufruf?

Ich sagte ihm, dass malloc() vom Speicherverwaltungs-Subsystem bedient wird. Die malloc()-Implementierung durchläuft die Liste des freien Speichers (physischer Speicher), wir nennen sie freie Liste, und findet einen geeigneten Chunk, der größer oder gleich 4 Bytes ist. Sobald ein solcher Chunk gefunden wird, wird er aus der freien Liste gelöscht und einer benutzten Liste hinzugefügt. Dann wird dieser physische Speicher der vma-Struktur des Prozessheaps zugeordnet. Er schien mit dieser Antwort nicht ganz zufrieden zu sein. Wie passt das Buddy-System dazu? Jede Hilfe wäre sehr willkommen.

  • er ist dann ziemlich sauer. malloc() ist im Usermode implementiert.

    – Chris Becke

    19. April 2011 um 12:10 Uhr

  • @ Chris: Meistens. malloc könnte am Ende sbrk aufrufen.

    – Tom Anderson

    19. April 2011 um 12:28 Uhr

  • @Chris: Nicht unbedingt. Die hier gegebene Antwort impliziert dies malloc() weist aus physischem Speicher zu, was falsch ist.

    – JeremyP

    19. April 2011 um 12:29 Uhr


  • Außerdem ist „Betriebssystem“ nicht dasselbe wie „Kernel“; Ich denke, wenn wir über Unix sprechen, ist es fair, „Betriebssystem“ so auszulegen, dass es „Kernel, Bootloader, Libc und grundlegende Programme im Benutzermodus wie init, getty, login und Freunde“ bedeutet. Je nachdem, wie der Interviewer seine Frage genau formuliert hat, könnte es eine faire Antwort sein, darüber zu sprechen, was der Zuordner im Benutzermodus tut.

    – Tom Anderson

    19. April 2011 um 12:31 Uhr

  • Vermutlich ist er mit Ihrer Mischung aus Benutzeraufruf malloc und Kernelfunktion malloc nicht zufrieden. Was Sie beschrieben haben, sollte die Funktionalität von Kernel Malloc sein.

    – CCNA

    2. Februar 2016 um 17:39 Uhr

Benutzeravatar von nos
Nr

Wenn Userspace-Anwendungen anrufen malloc(), ist dieser Aufruf nicht im Kernel implementiert. Stattdessen ist es ein Bibliotheksaufruf (implementierte glibc oder ähnliches).

Die Kurzversion ist, dass die malloc Implementierung in glibc erhält entweder Speicher von der brk()/sbrk() Systemaufruf oder anonymer Speicher über mmap(). Dies gibt glibc einen großen zusammenhängenden (in Bezug auf virtuelle Speicheradressen) Brocken Speicher, den die malloc Umsetzung weitere Scheiben und Würfel in kleineren Stücken und reicht an Ihre Anwendung.

Hierist klein malloc Implementierung, die Ihnen die Idee vermittelt, zusammen mit vielen, vielen Links.

Beachten Sie, dass sich noch nichts um den physischen Speicher kümmert – das wird vom virtuellen Kernel-Speichersystem gehandhabt, wenn das Prozessdatensegment über geändert wird brk()/sbrk() oder mmap()und wenn auf den Speicher verwiesen wird (durch Lesen oder Schreiben in den Speicher).

Zusammenfassen:

  1. malloc() Durchsucht seine verwalteten Speicherteile, um zu sehen, ob es ein Stück unbenutzten Speichers gibt, der die Zuordnungsanforderungen erfüllt.
  2. Andernfalls malloc() wird versuchen, das Prozessdatensegment zu erweitern (via sbrk()/brk() oder in einigen Fällen mmap()). sbrk() landet im Kernel.
  3. Das brk()/sbrk() Aufrufe im Kernel passen einige der Offsets in der an struct mm_struct des Prozesses, sodass das Prozessdatensegment größer wird. Zunächst wird den zusätzlichen virtuellen Adressen, die das Erweitern des Datensegments ergab, kein physischer Speicher zugeordnet.
  4. Wenn dieser nicht zugeordnete Speicher zum ersten Mal berührt wird (wahrscheinlich ein Lese-/Schreibvorgang durch die malloc Implementierung) springt ein Fehlerbehandler ein und fängt den Kernel ab, wo der Kernel dem nicht zugeordneten Speicher physikalischen Speicher zuweist.

  • Könnten Sie bitte erläutern, wie Punkt 4 passiert? Ich möchte nur wissen, wie der physische Speicher schließlich zugewiesen wird und welcher Teil des Kernel-Codes das tut? Vielen Dank.

    – Arjun Bora

    7. März 2016 um 0:28 Uhr

  • @ArjunBora Nein, das ist ein ziemlich großes Thema. Bitte stellen Sie lieber eine separate Frage.

    – Nr

    7. März 2016 um 8:00 Uhr


Benutzeravatar von jweyrich
jweyrich

malloc nicht befassen sich direkt mit dem physischen Gedächtnis. Es beschäftigt sich mit ausgelagerter virtueller Speicher – obwohl ich nicht sicher bin, ob es für jede Architektur da draußen gilt.

Wenn Ihr Programm versucht, Speicher zuzuweisen, und die freie Liste keinen Block gleicher oder größerer Größe als die angeforderte Größe enthält, wird eine komplett neue Seite zugewiesen. Die Seitengröße ist architekturabhängig (4096 Bytes auf x86). Die Seitenzuweisung ist etwas, das nur der Kernel durchführen kann, also a malloc call kann einen Systemaufruf verursachen. Die neue Adresse wird dann der freien Liste hinzugefügt und malloc manipuliert die freie Liste gemäß ihrer Implementierung (überprüfen Sie zum Beispiel glibc).

1413330cookie-checkWas passiert im Kernel während malloc?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy