Я пытаюсь понять несколько важных концепций ОС (для простоты, давайте придерживаться ядра Linux). Предположим, я запустил это в режим ядра, возможно, добавив эти строки (либо caseA, либо caseB не оба) в исходный код какого-либо системного вызова.Поведение ядра Linux при переполнении кучи или переполнении стека
# Assume __malloc() here is a simple heap memory manager
void consume_heap_forever(void)
{
for (;;)
(void) __malloc(PAGE_SIZE);
}
Вариант A: выше потребляет кучу в цикле. Сначала я начну потреблять память, и все будет нормально. После достаточно высокого потребления, что начинает происходить (до краха)? Я знаю, что пространство ядра находится в пределах зарезервированного фрагмента в адресном пространстве процесса. Будет ли я терпеть крах в точке, когда я пересекаю стек, который использует ядро? Или это расширит это резервирование (и, возможно, уничтожит всю виртуальную память)?
# Vanilla Factorial logic
int factorial(int value)
{
if (value == 0)
return 1;
return value * factorial(value-1)
}
Случай B: Я знаю, что ядро имеет фиксированный (и небольшое) количество стека, зарезервированный для него. Поэтому, возможно, когда я придаю значение достаточно большое - у меня закончится это предопределенное пространство стека. Какая авария происходит здесь? Перейду ли я в область кучи ядра?
В случае A, я буду расширять пространство ядра во время цикла? Я скажу, что изначально ядро взяло 1 ГБ 4 ГБ в VA. Теперь он будет расширяться дальше этого? – visweshn92
Вызов malloc в режиме ядра не приведет к расширению области системы. Если он вообще работает, он расширит область пользователя. – user3344003
Я имел в виду дальнейшее расширение только в «пользовательскую область». Так как он расширяет область пользователя для этого процесса. Будет ли каждый другой процесс видеть одно и то же расширенное пространство ядра? Поскольку пространство ядра обычно одинаково для всех процессов. Расширение одного процесса должно заставить его расширяться и в других, а также правильно? – visweshn92