2009-05-20 116 views
21

所有進程共享的內核堆棧還是每個進程都有獨立的內核堆棧?如果這個堆棧指針存儲在哪個進程的每個進程是分開的?在task_struct中?linux進程的內核堆棧

回答

17

只有一個普通的內核內存。其中每個進程都有自己的task_struct +內核堆棧(默認8K)。

在上下文切換中,舊的堆棧指針保存在某處,並且實際的堆棧指針指向要運行的新進程的棧頂(或底部,取決於硬件體系結構)。

12

This old article表示每個進程都有自己的內核堆棧。看到爲什麼這似乎是一個非常好的設計評論。

我試過reading the current source來確定,但由於內核堆棧是「隱含的」,它在task_struct中不可見。這在文章中提到。

此答案已經過編輯,以結合評論中的智慧。謝謝。

+3

我嚴重懷疑這可以改變。內核堆棧是一個非共享空間,系統調用可以放置它們的數據。如果你要在進程之間共享它們,幾​​個內核例程可以同時使用同一個堆棧 - >數據損壞。 – 2009-05-20 08:33:18

+1

我認爲每個進程都需要自己的內核堆棧,因爲幾個不同的進程可能會同時執行系統調用,而您不希望它們混淆。 – 2009-05-20 08:34:19

+0

每個進程都有自己的內核堆棧,每個內核堆棧都有其關聯的進程。它從未改變過。 這就是爲什麼在「ps」中有一些類似僞造的過程。 – 2009-05-20 08:41:17

2

Robert Love的書「Linux kernel Development」對進程內核棧有很好的解釋。

是的,每個進程都有自己的內核堆棧,如果我沒有錯,它的指針就存儲在thread_info結構中。但我並不確定,結構task_struct存儲在進程內核堆棧的開始或結束處,具體取決於CPU架構。

乾杯。 Carlos Maiolino

1

我認爲每個進程都有自己的內核模式堆棧。驅動程序正在內核模式下執行,在執行驅動程序時有時會阻塞進程。操作系統可以安排另一個進程運行。預定的進程可以再次調用驅動程序。如果內核堆棧是共享的,兩個進程正在使用內核堆棧,事情會混淆起來。很久以來,我對這個問題感到困惑。起初我認爲內核堆棧是共享的,一些書籍說。讀完Linux內核開發之後,看到一些驅動程序代碼,我開始認爲內核堆棧不共享。