根據我的理解,每個用戶進程都有獨立的內核堆棧。用戶進程的內核堆棧| Linux內核
如何使用這個內核堆棧,爲什麼我們不能只爲所有用戶進程使用一個堆棧? 這是如何幫助我們搶佔? 當內核在中斷上下文中運行時,使用了什麼棧?
[編輯:感興趣的結構是86]
根據我的理解,每個用戶進程都有獨立的內核堆棧。用戶進程的內核堆棧| Linux內核
如何使用這個內核堆棧,爲什麼我們不能只爲所有用戶進程使用一個堆棧? 這是如何幫助我們搶佔? 當內核在中斷上下文中運行時,使用了什麼棧?
[編輯:感興趣的結構是86]
如何這個內核棧用於
它用於例如當用戶模式過程中,通過系統調用進入內核。在內核的系統調用處理程序中,您將使用內核堆棧來存儲局部變量。
爲什麼我們不能爲所有用戶進程使用一個堆棧?
但是怎麼樣?他們將如何在SMP系統上同時使用它?這將導致數據損壞。
這是如何幫助我們搶佔?
我不確定你在問什麼。基本上它與非常間接的搶先有關。如果你被系統定時器中斷,你可能會切換到不同內核堆棧的不同線程。上下文可以保存在堆棧的頂部(我不確定是否以相同的方式實現它)。 Linux中還有一個preempt_counter
的東西,放在內核堆棧的頂部。該變量可以增加/減少preempt_disable(enable)
。什麼意思是內核線程搶佔switched off/on
。它被廣泛使用f.e.通過spinlocks
。
當內核在中斷環境中運行時,使用了什麼棧?
當我們從用戶去 - >內核在這種情況下,下面是發生了:
SS0
和ESP0
字段定義的此堆棧。處理器推動內核棧上的異常參數
+--------------------+ KSTACKTOP
| 0x00000 | old SS | " - 4
| old ESP | " - 8
| old EFLAGS | " - 12
| 0x00000 | old CS | " - 16
| old EIP | " - 20 <---- ESP
+--------------------+
處理器讀取IDT入口N(取決於哪個IRQ或異常出現),並且將CS:EIP以指向所描述的處理函數入口。
審查您所提供的鏈接後,我懷疑你沒有聽明白我的問題, 此外,你可以清楚地看到你的情況是存在的內核中只有一個堆所有進程。 這個問題是特定於Linux內核的。 –
TSS段在上下文切換期間發生更改,因此每個進程都有不同的TSS(這意味着不同的堆棧)。我認爲Linux使用相同的方法,不是嗎?你能否以其他方式假設它是如何工作的? –