müssen Sie verstehen, wie der virtuelle Speicher funktioniert und wie sich ein MMU-Mapping auf den realen RAM bezieht.
Real-RAM ist in Seiten aufgeteilt, traditionell 4kB jeweils. Jeder Prozess verfügt über ein eigenes MMU-Mapping, das diesem Prozess einen linearen Speicherbereich (4 GB in 32-Bit-Linux) zur Verfügung stellt. natürlich sind nicht alle von ihnen tatsächlich zugeteilt. Zunächst ist es fast leer, dh die meisten Adressen haben keine richtige Seite.
Wenn der Prozess eine nicht zugewiesene Adresse erreicht (entweder versucht, zu lesen, zu schreiben oder auszuführen), generiert die MMU einen Fehler (ähnlich einem Interrupt), und das VM-System wird aufgerufen. Wenn es entscheidet, dass irgendein RAM dort sein sollte, wählt es eine unbenutzte RAM-Seite und assoziiert mit diesem Adressbereich.
so kümmert sich der Kernel nicht, wie der Prozess Speicher verwendet, und der Prozess kümmert sich nicht wirklich, wie viel RAM dort ist, wird es immer die gleichen linearen 4 GB Adressraum haben.
jetzt arbeiten die brk/sbrk
auf einer etwas höheren Ebene: im Prinzip jede Speicheradresse 'jenseits' dieser Marke ist ungültig und wird nicht eine RAM-Seite erhalten, wenn zugegriffen wird, würde der Prozess stattdessen getötet werden. Die Userspace-Bibliothek verwaltet Speicherzuordnungen innerhalb dieses Limits und fordert den Kernel nur bei Bedarf auf, diesen zu erhöhen.
Aber auch wenn ein Prozess gestartet wurde, indem brk
auf das maximal zulässige gesetzt wurde, würde es keine echten RAM-Seiten zugewiesen bekommen, bis es anfängt, auf all diese Speicheradressen zuzugreifen.
"(sbrk ist ein Glibc-Wrapper um brk)" - Ich hatte Mühe, zu finden der Systemaufruf für sbrk. Es gibt keinen, macht jetzt Sinn. – automaton