我正在尋找linux內核中棧的很好的描述,但是我發現它很難找到有用的東西。Linux堆棧大小
我知道大多數系統的堆棧限制爲4k,其他系統限制爲8k。我假設每個內核線程/下半部分都有自己的堆棧。我也聽說如果中斷髮生,它會使用當前線程的堆棧,但是我找不到任何這樣的文檔。我正在尋找的是如何分配棧,如果有任何良好的調試例程(我懷疑特定問題的堆棧溢出,並且我想知道是否可以將內核編譯爲警察堆棧大小等)。
我正在尋找linux內核中棧的很好的描述,但是我發現它很難找到有用的東西。Linux堆棧大小
我知道大多數系統的堆棧限制爲4k,其他系統限制爲8k。我假設每個內核線程/下半部分都有自己的堆棧。我也聽說如果中斷髮生,它會使用當前線程的堆棧,但是我找不到任何這樣的文檔。我正在尋找的是如何分配棧,如果有任何良好的調試例程(我懷疑特定問題的堆棧溢出,並且我想知道是否可以將內核編譯爲警察堆棧大小等)。
對於進程,您可以通過ulimit
命令(-s
選項)控制進程的堆棧大小。對於線程,默認堆棧大小差異很大,但您可以通過調用pthread_attr_setstacksize()
(假設您正在使用pthreads)來控制它。
至於使用userland堆棧的中斷,我有點懷疑它,因爲訪問用戶態內存是內核的一種麻煩,尤其是來自中斷例程。但我不確定。
文檔稀缺的原因是它是一個與架構相關的領域。代碼確實是最好的文檔 - 例如,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
,則情況就是如此。
您可以使用ulimit
命令確定進程堆棧大小。我在我的系統上獲得8192 KiB:
$ ulimit -s
8192
質量差的答案,因爲問題是關於內核。引用_「在Linux內核中的堆棧」_。 – catpnosis 2015-10-15 18:43:44
@MilesRout我不好,我認爲它關心內核堆棧大小。 – 2016-04-18 11:15:11
事實上,這似乎不是正確的答案,但是尋求進程堆棧的大小(因爲問題可以回答它) – 2017-12-03 21:23:38
你正在使用什麼內核版本?所以我們更好地瞭解可用的內核調試配置選項。 – 2011-06-07 20:08:27
我似乎沒有得到這個。爲什麼調試器不足以完成任務? – cnicutar 2011-06-07 20:11:32
「下半部分」可能共享相同的堆棧。另外,「下半部分」很久以前就消失了,現在還剩下一些軟件。 – ninjalj 2011-06-07 20:48:21