Questo sarebbe parte dell'implementazione dello stack stesso. Se stai implementando uno stack in (ad esempio) C, puoi memorizzare il puntatore dello stack e il numero corrente di elementi. O lo stack pointer insieme alla base della pila, qualcosa come:
typedef struct {
int *sp_empty;
int *sp;
int *sp_full;
} tIntStack;
tIntStack stk;
// Initialise 20-element stack.
stk.sp = stk.sp_empty = malloc (sizeof(int) * 20);
stk.sp_full = &(stack[20]);
// Push a value x, detecting overflow.
if (stk.sp == stk.sp_full) { error here}
*(stk.sp) = x;
stk.sp++;
// Pop a value x, detecting underflow.
if (stk.sp == stk.sp_empty) { error here}
stk.sp--;
x = *(stk.sp);
Se si sta parlando di uno stack CPU (indirizzi di ritorno e così via), è possibile rilevare l'underflow dello stack in virtù del fatto che ti schianti. Male.
Ad esempio, in tempi antichi quando processori sono limitati a 64 KB spazio di indirizzi, CPU memoria tipicamente testato fino a trovare il primo byte che non ha letto lo stesso di quello che è stato appena scritto (in avvio processi). Il primo era oltre la reale memoria fisica, quindi impostarono SP su uno sotto. Naturalmente, alcune (poche) macchine avevano 64K di RAM fisica, quindi basta impostare SP all'inizio dello spazio degli indirizzi.
Il processo al giorno d'oggi, in enorme-indirizzo-spazio, memoria virtuale, multi-tasking sistemi operativi, è un po 'più complicato, ma si riduce ancora giù a (nella maggior parte dei casi): spazio
- Indirizzo è assegnato per un processo.
- SP è impostato in qualche punto dello spazio indirizzo.
- Esecuzioni del processo.
A quel punto, probabilmente siete da soli per quanto riguarda il kernel. La sua responsabilità si arresta nel punto in cui il codice inizia a funzionare diverso dal cambio di attività e fornisce i servizi richiesti, ma questo non ha nulla a che fare con lo stack. Se il tuo codice buggy è in overflow o sottobocca lo stack, questo è il tuo problema.
Il kernel può controllare il SP sul task switch per vedere se hai fatto qualcosa di sbagliato, ma questo non è affatto garantito. Può anche utilizzare la protezione della memoria hardware per rilevare un underflow (se lo stack si trova nella parte superiore dello spazio di indirizzi allocato). Ma ancora, questo dipende interamente dal kernel che stai usando.
Che cosa intendi per "underflow", ho solo sentito parlare di "overflow". – Mask
L'underflow si ha quando si tenta di estrarre un elemento da una pila vuota. Nella maggior parte dei sistemi, comporterà l'accesso a un indirizzo di memoria non mappato, causando un errore di segmentazione. –
Perché è necessario un errore di segmentazione invece di restituire solo un valore 'false'? – Mask