用戶棧與內(nèi)核棧有什么區(qū)別

內(nèi)核在創(chuàng)建進(jìn)程時(shí),會(huì)同時(shí)創(chuàng)建task_struct和進(jìn)程相應(yīng)堆棧。每個(gè)進(jìn)程都會(huì)有兩個(gè)堆棧,一個(gè)用戶棧,存在于用戶空間,一個(gè)內(nèi)核棧,存在于內(nèi)核空間。當(dāng)進(jìn)程在用戶空間運(yùn)行時(shí),CPU堆棧寄存器的內(nèi)容是用戶堆棧地址,使用用戶棧。當(dāng)進(jìn)程在內(nèi)核空間時(shí),CPU堆棧寄存器的內(nèi)容是內(nèi)核棧地址空間,使用的是內(nèi)核棧。

當(dāng)進(jìn)程因?yàn)橹袛嗷蛳到y(tǒng)調(diào)用進(jìn)入內(nèi)核時(shí),進(jìn)程使用的堆棧也需要從用戶棧到內(nèi)核棧。進(jìn)程陷入內(nèi)核態(tài)后,先把用戶堆棧的地址保存到內(nèi)核堆棧中,然后設(shè)置設(shè)置CPU堆棧寄存器為內(nèi)核棧的地址,這樣就完成了用戶棧到內(nèi)核棧的轉(zhuǎn)換。

當(dāng)進(jìn)程從內(nèi)核態(tài)恢復(fù)到用戶態(tài)時(shí),把內(nèi)核中保存的用戶態(tài)堆棧的地址恢復(fù)到堆棧指針寄存器即可。這樣就實(shí)現(xiàn)了內(nèi)核棧到用戶棧的轉(zhuǎn)換。

注意:陷入內(nèi)核棧時(shí),如何知道內(nèi)核棧的地址呢?
進(jìn)程由用戶棧到內(nèi)核棧轉(zhuǎn)換時(shí),進(jìn)程的內(nèi)核??偸强盏?。每次從用戶態(tài)陷入內(nèi)核時(shí),得到的內(nèi)核棧都是空的,所以在進(jìn)程陷入內(nèi)核時(shí),直接把內(nèi)核棧頂?shù)刂方o堆棧指針寄存器即可。

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

相關(guān)閱讀更多精彩內(nèi)容

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