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: 我知道的是,內核爲它保留的堆棧的固定(小)量。所以也許當我給一個足夠大的值時 - 我會用完預定義的堆棧空間。這裏發生了什麼樣的事故?我會跨進內核的堆部分嗎?
對於情況A,我將在循環時擴展內核空間嗎?我可以說最初的內核花費了1GB的4GB VA。現在它會進一步擴大嗎? – visweshn92
在內核模式下調用malloc不會擴展系統區域。如果它可以工作,它將擴大用戶區域。 – user3344003
我的意思是進一步擴展到「用戶區域」。因爲它擴展到用戶區域進行這個過程。每個其他進程是否會看到相同的擴展內核空間?因爲跨進程的內核空間通常是相同的。在一個流程中擴展應該使其在其他流程中擴展,對嗎? – visweshn92