Hallo,
ich stelle mir da ungefähr Folgendes vor:
(a) PMM: Verantwortlich für den physischen Adressraum (d.h. physisch verfügbarer RAM, MMIO und so weiter); hat eine Auflösung von 4 KB (*).
(b) VMM: Verantwortlich für den virtuellen Adressraum von Tasks, also das Mapping von RAM und MMIO-Adressen in die entsprechenden Tasks, das Ein- und Auslagern von Pages auf Sekundärspeicher (unter Zuhilfenahme der Treiber) und so Zeugs; hat eine Auflösung von 4 KB (*).
(c) Malloc: Verantwortlich für den Heap und die Aufteilung von Pages in mehrere kleinere Einheiten; liegt in der libc (bzw. System-Runtime) und hat eine beliebig kleine Auflösung, nutzt den VMM.
(*) Optimal wäre statt 4 KB die Pagegröße, die je nach Nutzung und Größe des Blocks auch größer sein kann (Hugepages, z.B. 2 MB oder so).
Wenn ich auf dem Holzweg bin, bitte melden.
Im Kernel brauchst du nicht unbedingt ein malloc/kalloc (je nach Design). Ansonsten kannst du dort eine eigene Implementation bereitstellen; die Treiber nutzen trotzdem die Userspace-Implementation in der libc.
Gruß,
Svenska