2017-02-14 113 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,我將在循環時擴展內核空間嗎?我可以說最初的內核花費了1GB的4GB VA。現在它會進一步擴大嗎? – visweshn92

+0

在內核模式下調用malloc不會擴展系統區域。如果它可以工作,它將擴大用戶區域。 – user3344003

+0

我的意思是進一步擴展到「用戶區域」。因爲它擴展到用戶區域進行這個過程。每個其他進程是否會看到相同的擴展內核空間?因爲跨進程的內核空間通常是相同的。在一個流程中擴展應該使其在其他流程中擴展,對嗎? – visweshn92