怎么理解linux內(nèi)核棧?
內(nèi)核棧有不同含義。一是內(nèi)核線程使用的棧,比如初始化線程,idle,kthread,這些僅在內(nèi)核空間運(yùn)行,只有內(nèi)核棧,沒有用戶態(tài)以及用戶空間棧。還有就是用戶線程發(fā)生中斷,系統(tǒng)調(diào)用進(jìn)入內(nèi)核態(tài)時候使用的棧。由于中斷處理很簡單,而且不允許中斷重入,使用的內(nèi)核棧很少,4k/8k就夠了。還有是異常棧,專門處理異常,跟中斷棧分開,否則在中斷處理發(fā)生異常就導(dǎo)致重入了。系統(tǒng)調(diào)用內(nèi)核棧也是分開的。但有時候中斷處理,系統(tǒng)調(diào)用實(shí)際上要處理很多東西的,但內(nèi)核不是直接在中斷棧處理所有事情,而是處理最簡單的部分,復(fù)雜的交給其他內(nèi)核線程/軟中斷完成。中斷/異常處理/系統(tǒng)調(diào)用內(nèi)核棧是所有進(jìn)程共享的。但不是說只有一份,而是每個虛擬cpu核心一份。那如果同一個cpu多個線程切換怎么辦?比如系統(tǒng)調(diào)用過程中發(fā)生時鐘硬件中斷,這個時候發(fā)現(xiàn)需要切換線程。如果在內(nèi)核棧處理一半過程中發(fā)生切換,那就會出現(xiàn)問題。為了避免這個問題,線程切換都發(fā)生在中斷/系統(tǒng)調(diào)用返回的時候,即內(nèi)核?;謴?fù)到棧頂?shù)臅r候發(fā)生任務(wù)切換。即本來硬件中斷返回原來線程,如果發(fā)生切換,返回的時候發(fā)回b線程。對于需要長時間處理的系統(tǒng)調(diào)用,中斷處理,會有內(nèi)核線程進(jìn)行處理,同樣也是在中斷/系統(tǒng)調(diào)用返回的時候切換到內(nèi)核線程。
剛好,我這里有上位機(jī)入門,學(xué)習(xí)線路圖,各種項(xiàng)目,需要留個6。