2017-04-23 52 views
0

根據我的理解,每個用戶進程都有獨立的內核堆棧。用戶進程的內核堆棧| Linux內核

如何使用這個內核堆棧,爲什麼我們不能只爲所有用戶進程使用一個堆棧? 這是如何幫助我們搶佔? 當內核在中斷上下文中運行時,使用了什麼棧?

[編輯:感興趣的結構是86]

回答

2

如何這個內核棧用於

它用於例如當用戶模式過程中,通過系統調用進入內核。在內核的系統調用處理程序中,您將使用內核堆棧來存儲局部變量。

爲什麼我們不能爲所有用戶進程使用一個堆棧?

但是怎麼樣?他們將如何在SMP系統上同時使用它?這將導致數據損壞。

這是如何幫助我們搶佔?

我不確定你在問什麼。基本上它與非常間接的搶先有關。如果你被系統定時器中斷,你可能會切換到不同內核堆棧的不同線程。上下文可以保存在堆棧的頂部(我不確定是否以相同的方式實現它)。 Linux中還有一個preempt_counter的東西,放在內核堆棧的頂部。該變量可以增加/減少preempt_disable(enable)。什麼意思是內核線程搶佔switched off/on。它被廣泛使用f.e.通過spinlocks

當內核在中斷環境中運行時,使用了什麼棧?

當我們從用戶去 - >內核在這種情況下,下面是發生了:

  1. 內核棧。處理器切換到由TSSSS0ESP0字段定義的此堆棧。
  2. 處理器推動內核棧上的異常參數

      +--------------------+ KSTACKTOP    
         | 0x00000 | old SS |  " - 4 
         |  old ESP  |  " - 8 
         |  old EFLAGS  |  " - 12 
         | 0x00000 | old CS |  " - 16 
         |  old EIP  |  " - 20 <---- ESP 
         +--------------------+    
    
  3. 處理器讀取IDT入口N(取決於哪個IRQ或異常出現),並且將CS:EIP以指向所描述的處理函數入口。

  4. 處理函數接受控制並處理異常。

來源:https://pdos.csail.mit.edu/6.828/2016/labs/lab3/

+0

審查您所提供的鏈接後,我懷疑你沒有聽明白我的問題, 此外,你可以清楚地看到你的情況是存在的內核中只有一個堆所有進程。 這個問題是特定於Linux內核的。 –

+0

TSS段在上下文切換期間發生更改,因此每個進程都有不同的TSS(這意味着不同的堆棧)。我認爲Linux使用相同的方法,不是嗎?你能否以其他方式假設它是如何工作的? –

相關問題