今天和一個朋友聊天,朋友說在編寫驅(qū)動時遇到一個怪異的問題。他在內(nèi)核中使用了一個深度函數(shù)調(diào)用(多層嵌套的函數(shù)),但沒有實現(xiàn)預(yù)定的效果,但如果把嵌套去掉,函數(shù)就沒問題了。當時我也沒有多想,就回答可能是編譯器的問題?;貋砗箢^腦中又浮現(xiàn)出這個問題,突然想到內(nèi)核棧,覺得這個問題的原因應(yīng)該出在內(nèi)核棧上。下面簡要介紹下內(nèi)核的知識。
用戶空間運行的程序可以從用戶空間的棧上分配大量的空間來存放變量或數(shù)組、大的結(jié)構(gòu)體。之所以可以這么做,是因為用戶空間棧本身比較大,而且還能動態(tài)增長。進程的內(nèi)核棧即不大也不能動態(tài)增長;它在32位機上的內(nèi)核棧為8KB,而64位機是16KB。
每個進程都有自己的內(nèi)核棧。進程在內(nèi)核執(zhí)行期間的每個調(diào)用鏈必須放在自己的內(nèi)核棧上。中斷處理程序也使用配它們打斷的進程堆棧。這就意味著,在惡劣的情況下,8KB的內(nèi)核??赡軙欢鄠€函數(shù)的嵌套調(diào)用鏈和幾個中斷程序來共享。呵呵,顯然深度的嵌套會導(dǎo)致溢出了。
節(jié)省內(nèi)核棧的方法有:減少局部變量、大型數(shù)組和結(jié)構(gòu)體、嵌套調(diào)用鏈。
內(nèi)核棧的使用
更新時間: 2008-08-27 14:05:38來源: 粵嵌教育瀏覽量:1403
免費預(yù)約試聽課
- 姓名
- 電話
- 獲取試聽資格