2011-06-07 299 views
34

我正在尋找linux內核中棧的很好的描述,但是我發現它很難找到有用的東西。Linux堆棧大小

我知道大多數系統的堆棧限制爲4k,其他系統限制爲8k。我假設每個內核線程/下半部分都有自己的堆棧。我也聽說如果中斷髮生,它會使用當前線程的堆棧,但是我找不到任何這樣的文檔。我正在尋找的是如何分配棧,如果有任何良好的調試例程(我懷疑特定問題的堆棧溢出,並且我想知道是否可以將內核編譯爲警察堆棧大小等)。

+0

你正在使用什麼內核版本?所以我們更好地瞭解可用的內核調試配置選項。 – 2011-06-07 20:08:27

+0

我似乎沒有得到這個。爲什麼調試器不足以完成任務? – cnicutar 2011-06-07 20:11:32

+0

「下半部分」可能共享相同的堆棧。另外,「下半部分」很久以前就消失了,現在還剩下一些軟件。 – ninjalj 2011-06-07 20:48:21

回答

1

對於進程,您可以通過ulimit命令(-s選項)控制進程的堆棧大小。對於線程,默認堆棧大小差異很大,但您可以通過調用pthread_attr_setstacksize()(假設您正在使用pthreads)來控制它。

至於使用userland堆棧的中斷,我有點懷疑它,因爲訪問用戶態內存是內核的一種麻煩,尤其是來自中斷例程。但我不確定。

32

文檔稀缺的原因是它是一個與架構相關的領域。代碼確實是最好的文檔 - 例如,THREAD_SIZE宏定義了(依賴於體系結構的)每線程內核堆棧大小。

堆棧分配在alloc_thread_info_node()或該函數的體系結構特定覆蓋(struct thread_info始終位於堆棧的底部)。 struct task_struct中的堆棧指針在dup_task_struct()中更新,它被稱爲克隆線程的一部分。

內核通過在堆棧末尾放置一個金絲雀值STACK_END_MAGIC(緊接在內存中的struct thread_info之後)來檢查內核堆棧溢出。在頁面錯誤處理程序中,如果發生內核空間錯誤,則檢查此金絲雀 - 例如參見the x86 fault handler,如果堆棧金絲雀已被破壞,則在Oops消息之後打印消息Thread overran stack, or stack corrupted

當然這並不會觸發全部堆棧超限,只有那些可以摧毀堆棧的幣種。但是,如果您遇到堆棧溢出,您應該始終能夠從Oops輸出中得知 - 如果堆棧指針低於&threadinfo,則情況就是如此。

5

您可以使用ulimit命令確定進程堆棧大小。我在我的系統上獲得8192 KiB:

$ ulimit -s 
8192 
+5

質量差的答案,因爲問題是關於內核。引用_「在Linux內核中的堆棧」_。 – catpnosis 2015-10-15 18:43:44

+2

@MilesRout我不好,我認爲它關心內核堆棧大小。 – 2016-04-18 11:15:11

+0

事實上,這似乎不是正確的答案,但是尋求進程堆棧的大小(因爲問題可以回答它) – 2017-12-03 21:23:38