Это будет частью реализации самого стека. Если вы реализуете стек в (например) C, вы можете хранить указатель стека и текущего количества элементов. Или указатель стека вместе с основанием стека, что-то вроде:
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);
Если вы говорите о стеке ЦП (адресах возврата и т. Д.), Вы можете обнаружить переполнение стека в силу того, что у вас произошел сбой. Нехорошо.
Например, в старые времена, когда процессоры были ограничены адресным пространством 64 КБ, ЦП обычно проверяли память, пока не нашли первый байт, который не читал то, что было только что записано (в процессе загрузки). Это был первый байт за пределами физической памяти, поэтому они установили SP на единицу ниже. Конечно, некоторые (небольшое количество) машин имели 64 КБ физической памяти, поэтому просто установите SP в верхнюю часть адресного пространства.
В настоящее время этот процесс в многоадресных операционных системах с огромным адресным пространством, виртуальной памятью немного сложнее, но все же сводится к (в большинстве случаев):
- Адресное пространство выделено для процесса.
- SP установлен где-то в этом адресном пространстве.
- Процесс запущен.
В этот момент вы, вероятно, сами по себе в отношении ядра. Его ответственность прекращается с того момента, когда ваш код начинает работать, кроме переключения задач и предоставления услуг по запросу, но это не имеет никакого отношения к вашему стеку. Если ваш глючный код переполняет или переполняет стек, это ваша проблема.
Ядро может проверить ваш SP на переключателе задач, чтобы убедиться, что вы сделали что-то не так, но это отнюдь не гарантировано. Он также может использовать аппаратную защиту памяти для обнаружения недостаточного количества памяти (если стек находится на вершине выделенного вами адресного пространства). Но опять же, это полностью зависит от используемого вами ядра.