Linux 核心堆疊

2021-06-17 19:54:10 字數 640 閱讀 5273

所有程序(包括核心程序和普通程序)都有乙個核心棧,在x86的32位機器上核心棧大小可以為4kb或8kb,這個可以在編譯核心的時候配置。核心棧的用途有兩個:1)當程序陷入核心態,即核心代表程序執行系統呼叫時,系統呼叫的引數就放在核心棧上,核心棧記錄著程序的在核心中的呼叫鏈;2)在核心棧被配置成8kb大小的情況下,當中斷服務程式中斷當前程序時,它將使用當前被中斷程序的核心棧。

對於使用者程序,其既有使用者位址空間中的棧,也有它自己的核心棧。而核心程序就只有核心棧。

每乙個程序(包括普通程序和核心程序)的位址空間都分為使用者位址空間和核心位址空間兩部分,在32位的x86機器上,使用者位址空間的範圍是0~3g,核心位址空間的範圍是3g~4g.對於不同的程序,其使用者位址空間會隨著程序不同而不同,但所有程序的核心位址空間則都是一樣的。對於核心程序,由於其始終執行在核心態,所以沒有使用者位址空間,其對應的tast_struct結構體中的mm域也就被賦值為null。而堆的概念應該是只存在於程序的使用者位址空間中,所以核心程序是沒有堆一說的。核心執行緒可以用kmalloc 或vmalloc在執行時申請記憶體。kmalloc或vmalloc申請到的內存在整個核心中都可以使用。比方說 核心執行緒a申請到了一塊記憶體a, 只要把該記憶體的首位址傳給另乙個核心執行緒b,則在b中同樣也可以使用這塊記憶體。

Linux 核心堆疊

所有程序 包括核心程序和普通程序 都有乙個核心棧,在x86的32位機器上核心棧大小可以為4kb或8kb,這個可以在編譯核心的時候配置。核心棧的用 途有兩個 1 當程序陷入核心態,即核心代表程序執行系統呼叫時,系統呼叫的引數就放在核心棧上,核心棧記錄著程序的在核心中的呼叫鏈 2 在核心棧被配 置成8k...

x86 64 核心堆疊

switch to.h中 define switch to prev,next,last do while 0 會切換將切換前的程序核心堆疊指標用彙編movl esp,prev sp 儲存。其中被儲存的位址 prev sp 是prev thread.sp 切換後的程序esp從儲存中恢復使用彙編 mo...

中斷發生時使用者堆疊和核心堆疊的切換

如果乙個中斷產生時任務正在使用者 中執行,那麼該中斷會引起cpu特權級從3到0的變化,此時cpu就會執行使用者態堆疊到核心態堆疊的切換操作。cpu會從當前任務的任務狀態段tss中取得新堆疊的段選擇符和偏移量。因為中斷服務程式在核心中,屬於0級特權級 所以48位的核心態堆疊指標會從tss的ss0和es...