2017-02-14 5 views
3

Я пытаюсь понять несколько важных концепций ОС (для простоты, давайте придерживаться ядра 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: Я знаю, что ядро ​​имеет фиксированный (и небольшое) количество стека, зарезервированный для него. Поэтому, возможно, когда я придаю значение достаточно большое - у меня закончится это предопределенное пространство стека. Какая авария происходит здесь? Перейду ли я в область кучи ядра?

ответ

0

В вашем примере A ваше приложение будет работать навсегда. В какой-то момент malloc не сможет сопоставить страницы с логическим адресным пространством и вернет 0.

В вашем примере B: Каждый процесс имеет свой собственный стек режима ядра (как правило, имеется один общий стек прерываний).

Вероятно, вы в конце концов попали на страницу охраны в конце стека и получили нарушение доступа. Вы не собираетесь запускать пул памяти ядра.

+0

В случае A, я буду расширять пространство ядра во время цикла? Я скажу, что изначально ядро ​​взяло 1 ГБ 4 ГБ в VA. Теперь он будет расширяться дальше этого? – visweshn92

+0

Вызов malloc в режиме ядра не приведет к расширению области системы. Если он вообще работает, он расширит область пользователя. – user3344003

+0

Я имел в виду дальнейшее расширение только в «пользовательскую область». Так как он расширяет область пользователя для этого процесса. Будет ли каждый другой процесс видеть одно и то же расширенное пространство ядра? Поскольку пространство ядра обычно одинаково для всех процессов. Расширение одного процесса должно заставить его расширяться и в других, а также правильно? – visweshn92