進(jìn)程內(nèi)核棧、用戶棧

1.1. 進(jìn)程的堆棧

內(nèi)核在創(chuàng)建進(jìn)程的時候,在創(chuàng)建task_struct的同時,會為進(jìn)程創(chuàng)建相應(yīng)的堆棧。每個進(jìn)程會有兩個棧,一個用戶棧,存在于用戶空間,一個內(nèi)核棧,存在于內(nèi)核空間。
當(dāng)進(jìn)程在用戶空間運(yùn)行時,cpu堆棧指針寄存器里面的內(nèi)容是用戶堆棧地址,使用用戶棧;
當(dāng)進(jìn)程在內(nèi)核空間運(yùn)行時,cpu堆棧指針寄存器里面的內(nèi)容是內(nèi)核??臻g地址,使用內(nèi)核棧。

1.2. 進(jìn)程用戶棧和內(nèi)核棧的切換

當(dāng)進(jìn)程因為中斷或者系統(tǒng)調(diào)用而陷入內(nèi)核態(tài)之行時,進(jìn)程所使用的堆棧也要從用戶棧轉(zhuǎn)到內(nèi)核棧。

進(jìn)程陷入內(nèi)核態(tài)后,先把用戶態(tài)堆棧的地址保存在內(nèi)核棧之中,然后設(shè)置堆棧指針寄存器的內(nèi)容為內(nèi)核棧的地址,這樣就完成了用戶棧向內(nèi)核棧的轉(zhuǎn)換;當(dāng)進(jìn)程從內(nèi)核態(tài)恢復(fù)到用戶態(tài)之行時,在內(nèi)核態(tài)之行的最后將保存在內(nèi)核棧里面的用戶棧的地址恢復(fù)到堆棧指針寄存器即可。這樣就實現(xiàn)了內(nèi)核棧和用戶棧的互轉(zhuǎn)。

那么,我們知道從內(nèi)核轉(zhuǎn)到用戶態(tài)時用戶棧的地址是在陷入內(nèi)核的時候保存在內(nèi)核棧里面的,但是在陷入內(nèi)核的時候,我們是如何知道內(nèi)核棧的地址的呢?

關(guān)鍵在進(jìn)程從用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài)的時候,進(jìn)程的內(nèi)核棧總是空的。這是因為,當(dāng)進(jìn)程在用戶態(tài)運(yùn)行時,使用的是用戶棧,當(dāng)進(jìn)程陷入到內(nèi)核態(tài)時,內(nèi)核棧保存進(jìn)程在內(nèi)核態(tài)運(yùn)行的相關(guān)信心,但是一旦進(jìn)程返回到用戶態(tài)后,內(nèi)核棧中保存的信息無效,會全部恢復(fù),因此每次進(jìn)程從用戶態(tài)陷入內(nèi)核的時候得到的內(nèi)核棧都是空的。所以在進(jìn)程陷入內(nèi)核的時候,直接把內(nèi)核棧的棧頂?shù)刂方o堆棧指針寄存器就可以了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容