在Linux系統(tǒng)中锌介,每一個用戶進程都有兩個棧嗜诀,一個用戶棧,存在于用戶空間孔祸,一個內(nèi)核棧隆敢,存在于內(nèi)核空間。當進程在用戶空間運行時崔慧,CPU堆棧寄存器的內(nèi)容是用戶堆棧地址拂蝎,使用用戶棧。當進程在內(nèi)核空間時惶室,CPU堆棧寄存器的內(nèi)容是內(nèi)核棧地址空間温自,使用的是內(nèi)核棧玄货。
當進程因為中斷或系統(tǒng)調(diào)用進入內(nèi)核時,進程使用的堆棧也需要從用戶棧到內(nèi)核棧捣作。進程陷入內(nèi)核態(tài)后誉结,先把用戶堆棧的地址保存到內(nèi)核堆棧中,然后設(shè)置設(shè)置CPU堆棧寄存器為內(nèi)核棧的地址券躁,這樣就完成了用戶棧到內(nèi)核棧的轉(zhuǎn)換惩坑。
TSS(Task State segment)用于存儲進程內(nèi)核堆棧的段選擇器和堆棧指針。
當進程從內(nèi)核態(tài)恢復到用戶態(tài)時也拜,把內(nèi)核中保存的用戶態(tài)堆棧的地址恢復到堆棧指針寄存器即可以舒。這樣就實現(xiàn)了內(nèi)核棧到用戶棧的轉(zhuǎn)換。
注意:陷入內(nèi)核棧時慢哈,如何知道內(nèi)核棧的地址呢蔓钟?
進程由用戶棧到內(nèi)核棧轉(zhuǎn)換時,進程的內(nèi)核椔鸭總是空的滥沫。每次從用戶態(tài)陷入內(nèi)核時,得到的內(nèi)核棧都是空的键俱,所以在進程陷入內(nèi)核時兰绣,直接把內(nèi)核棧頂?shù)刂方o堆棧指針寄存器即可。