2017-02-14 2 views
3

Ich versuche, einige wichtige Betriebssystem-Konzepte zu verstehen (aus Gründen der Einfachheit, bleiben Sie bei Linux-Kernel). Angenommen, ich betreibe diese in Kernel-Modus, vielleicht folgende Zeilen (entweder Casea oder caseB nicht beide) in den Quellcode einiger Systemaufruf.Linux-Kernel-Verhalten bei Heap-Overrun oder Stack-Überlauf

# Assume __malloc() here is a simple heap memory manager 
void consume_heap_forever(void) 
    { 

     for (;;) 
     (void) __malloc(PAGE_SIZE);   
    } 

Fall A: Die obige verbraucht Heap in einer Schleife. Ich werde zuerst anfangen, Speicher zu verbrauchen, und die Dinge werden normal werden. Nach einem ausreichend hohen Verbrauch, was beginnt (vor einem Absturz)? Ich weiß, dass der Kernel-Speicherplatz innerhalb des reservierten Chunks im Prozessadressraum liegt. Werde ich an einem Punkt abstürzen, wenn ich den Stapelbereich durchquere, den der Kernel benutzt? Oder erweitert dies die Reservierung (und verbraucht möglicherweise den gesamten virtuellen Speicher)?

# Vanilla Factorial logic 
int factorial(int value) 
    { 
     if (value == 0) 
      return 1; 
     return value * factorial(value-1) 
    } 

Fall B: Ich bin mir bewusst, dass der Kernel eine feste (und kleine) Menge Stack für sie reserviert hat. Wenn ich also einen Wert gebe, der groß genug ist, werde ich den vordefinierten Stapelspeicherplatz verlassen. Was für ein Unfall passiert hier? Werde ich in den Heap-Abschnitt des Kernels einsteigen?

Antwort

0

In Ihrem Beispiel A würde Ihre Anwendung für immer eine Schleife bilden. An einem bestimmten Punkt kann malloc keine Seiten mehr dem logischen Adressraum zuordnen und gibt 0 zurück.

In Ihrem Beispiel B: Jeder Prozess hat seinen eigenen Kernel-Modus-Stack (normalerweise gibt es einen gemeinsamen Interrupt-Stack).

Es ist wahrscheinlich, dass Sie schließlich am Ende des Stapels eine Schutzseite getroffen haben und eine Zugriffsverletzung erhalten. Sie werden nicht über den Speicherpool des Kerns laufen.

+0

Für den Fall A, werde ich meinen Kernelraum während der Schleife erweitern? Nehmen wir zum Beispiel an, dass der Kernel anfangs 1 GB von 4 GB in VA benötigte. Wird es sich jetzt weiter ausdehnen? – visweshn92

+0

Der Aufruf von malloc im Kernel-Modus erweitert den Systembereich nicht. Wenn es überhaupt funktioniert, würde es den Benutzerbereich erweitern. – user3344003

+0

Ich wollte nur weiter in "Benutzerbereich" erweitern. Seit diesem Zeitpunkt erweitert es sich in den Benutzerbereich für diesen Prozess. Wird jeder andere Prozess den gleichen erweiterten Kernelraum sehen? Da der Kernel-Speicherplatz in allen Prozessen identisch ist. Erweiterung in einem Prozess sollte es auch in anderen erweitern, oder? – visweshn92

Verwandte Themen