程序的使用者棧和核心棧

2021-10-10 12:33:43 字數 677 閱讀 7313

詳細參考:

核心在建立程序的時候,在建立task_struct的同時,會為程序建立相應的堆疊。每個程序會有兩個棧,乙個使用者棧,存在於使用者空間,乙個核心棧,存在於核心空間。

當程序在使用者空間執行時,cpu堆疊指標暫存器裡面的內容是使用者堆疊位址,使用使用者棧;

當程序在核心空間執行時,cpu堆疊指標暫存器裡面的內容是核心棧空間位址,使用核心棧。

當程序因為中斷或者系統呼叫而陷入核心態之行時,程序所使用的堆疊也要從使用者棧轉到核心棧。

程序陷入核心態後,先把使用者態堆疊的位址儲存在核心棧之中,然後設定堆疊指標暫存器的內容為核心棧的位址,這樣就完成了使用者棧向核心棧的轉換;當程序從核心態恢復到使用者態之行時,在核心態之行的最後將儲存在核心棧裡面的使用者棧的位址恢復到堆疊指標暫存器即可。這樣就實現了核心棧和使用者棧的互轉。

那麼,我們知道從核心轉到使用者態時使用者棧的位址是在陷入核心的時候儲存在核心棧裡面的,但是在陷入核心的時候,我們是如何知道核心棧的位址的呢?

關鍵在程序從使用者態轉到核心態的時候,程序的核心棧總是空的。這是因為,當程序在使用者態執行時,使用的是使用者棧,當程序陷入到核心態時,核心棧儲存程序在核心態執行的相關信心,但是一旦程序返回到使用者態後,核心棧中儲存的資訊無效,會全部恢復,因此每次程序從使用者態陷入核心的時候得到的核心棧都是空的。所以在程序陷入核心的時候,直接把核心棧的棧頂位址給堆疊指標暫存器就可以了。

程序核心棧 使用者棧

1.程序的堆疊 核心在建立程序的時候,在建立task struct的同事,會為程序建立相應的堆疊。每個程序會有兩個棧,乙個使用者棧,存在於使用者空間,乙個核心棧,存在於核心空間。當程序在使用者空間執行時,cpu堆疊指標暫存器裡面的內容是使用者堆疊位址,使用使用者棧 當程序在核心空間時,cpu堆疊指標...

程序核心棧 使用者棧

1.程序的堆疊 核心在建立程序的時候,在建立task struct的同事,會為程序建立相應的堆疊。每個程序會有兩個棧,乙個使用者棧,存在於使用者空間,乙個核心棧,存在於核心空間。當程序在使用者空間執行時,cpu堆疊指標暫存器裡面的內容是使用者堆疊位址,使用使用者棧 當程序在核心空間時,cpu堆疊指標...

核心棧和使用者棧

核心棧和使用者棧區別 intel的cpu分為四個執行級別ring0 ring3 核心建立程序,建立程序的同時建立程序控制塊,建立程序自己的堆疊 乙個程序有兩個堆疊,使用者棧和系統棧 使用者堆疊的空間指向使用者位址空間,核心堆疊的空間指向核心位址空間。有個cpu堆疊指標暫存器,程序執行的狀態有使用者態...