今天和乙個朋友聊天,朋友說在編寫驅動時遇到乙個怪異的問題。他在核心中使用了乙個深度函式呼叫(多層巢狀的函式),但沒有實現預定的效果,但如果把巢狀去掉,函式就沒問題了。當時我也沒有多想,就回答可能是編譯器的問題。回來後頭腦中又浮現出這個問題,突然想到核心棧,覺得這個問題的原因應該出在核心棧上。下面簡要介紹下核心的知識。
使用者空間執行的程式可以從使用者空間的棧上分配大量的空間來存放變數或陣列、大的結構體。之所以可以這麼做,是因為使用者空間棧本身比較大,而且還能動態增長。程序的核心棧即不大也不能動態增長;它在32位機上的核心棧為8kb,而64位機是16kb。
每個程序都有自己的核心棧。程序在核心執行期間的每個呼叫鏈必須放在自己的核心棧上。中斷處理程式也使用配它們打斷的程序堆疊。這就意味著,在最惡劣的情況下,8kb的核心棧可能會被多個函式的巢狀呼叫鏈和幾個中斷程式來共享。呵呵,顯然深度的巢狀會導致溢位了。
節省核心棧的方法有:減少區域性變數、大型陣列和結構體、巢狀呼叫鏈。
核心棧的使用
今天和乙個朋友聊天,朋友說在編寫驅動時遇到乙個怪異的問題。他在核心中使用了乙個深度函式呼叫 多層巢狀的函式 但沒有實現預定的效果,但如果把巢狀去掉,函式就沒問題了。當時我也沒有多想,就回答可能是編譯器的問題。回來後頭腦中又浮現出這個問題,突然想到核心棧,覺得這個問題的原因應該出在核心棧上。下面簡要介...
核心棧的使用
今天和乙個朋友聊天,朋友說在編寫驅動時遇到乙個怪異的問題。他在核心中使用了乙個深度函式呼叫 多層巢狀的函式 但沒有實現預定的效果,但如果把巢狀去掉,函式就沒問題了。當時我也沒有多想,就回答可能是編譯器的問題。回來後頭腦中又浮現出這個問題,突然想到核心棧,覺得這個問題的原因應該出在核心棧上。下面簡要介...
核心棧的使用
今天和乙個朋友聊天,朋友說在編寫驅動時遇到乙個怪異的問題。他在核心中使用了乙個深度函式呼叫 多層巢狀的函式 但沒有實現預定的效果,但如果把巢狀去掉,函式就沒問題了。當時我也沒有多想,就回答可能是編譯器的問題。回來後頭腦中又浮現出這個問題,突然想到核心棧,覺得這個問題的原因應該出在核心棧上。下面簡要介...