2016-06-01 24 views
3

Ich weiß, dass die Stapelgröße durch die Begrenzungsfunktion steuerbar ist, aber wie setzt der Kernel einige dieser Grenzen durch, wie RLIMIT_STACK? Da Linux nicht in Stack-Operationen involviert ist (es ist nur eine mov- oder push-Anweisung), wie setzt der Kernel SIGSEGV ab, wenn Sie das Limit überschreiten? Ich verstehe, dass die CPU für die virtuelle Adressierung eine Funktion bietet, die der Linux-Kernel verwenden kann. Ist das ähnlich wie die Begrenzung der Stapelgröße erzwungen? Oder führt Linux eine routinemäßige Überprüfung der Stack-Größen durch und gibt Segment-Defaults "nach dem Verbrechen" aus? Oder gibt es eine dritte Option?Wie erzwingt der Linux-Kernel Stapelgrößenbeschränkungen?

Antwort

3

Der Kernel kann dies aufgrund des virtuellen Speichers steuern. Der virtuelle Speicher (auch bekannt als Speicherabbildung) ist im Grunde eine Liste von virtuellen Speicherbereichen (Basis + Größe) und einem physikalischen Zielspeicherbereich, den der Kernel bearbeiten kann, der für jedes Programm einzigartig ist. Wenn ein Programm versucht, auf eine Adresse zuzugreifen, die nicht in dieser Liste enthalten ist, tritt eine Ausnahme auf. Diese Ausnahme bewirkt einen Kontextwechsel in den Kernel-Modus. Der Kernel kann den Fehler nachschlagen. Wenn der Speicher gültig werden soll, wird er an Ort und Stelle gesetzt, bevor das Programm fortgesetzt werden kann (zum Beispiel tauschen und mmap noch nicht von der Platte lesen), oder es kann ein SEGFAULT erzeugt werden.

Um die Begrenzung der Stackgröße zu bestimmen, manipuliert der Kernel einfach die virtuelle Speicherzuordnung.

+0

danke, das macht Sinn. Bezieht sich dies darauf, dass irgendetwas in den oberen 8 MB (oder Stack-Größenlimit) des Speichers auf eine Ausnahme vom Kernel abgebildet wird, während Bereiche darunter über SYS_BRK angefordert werden müssen? –

+0

brk/sbrk kann meine libc verwendet werden, um den Heap-Space zu erhöhen. Man-Seite gibt an, dass dies normalerweise dem Datenbereich folgt. Der Stack-Speicher kann theoretisch an jedem Speicherort platziert werden, und viele Kernel und Betriebssysteme tun dies genau, um es schwerer zu machen, Software mit Sicherheitsfehlern in ihnen zu nutzen. –