- **Cdecl **(函數調用)
低位地址 | |
---|---|
局部變量 | |
上一層[ebp] | ------ [ebp] pushl %ebp; movl %esp, %ebp
|
返回地址 | (call 指令) |
參數1 | |
參數2 | |
... | |
高位地址 (棧底) |
段機制
Paste_Image.png
- GDTR 48位 [limit(bytes), base (物理地址)]
- GDT 64位
Paste_Image.png
- Selector
Paste_Image.png
- 關于權限
- 數據段選擇子(DS, SS等)里的請求特權級(Requested Privilege Level, RPL)
- CS里的當前特權級(Current Privilege Level, CPL)
- 段描述符里的描述符特權級(Descriptor Privilege Level, DPL)
- 當描述符被加載時:
Paste_Image.png
(SS要求CPL,RPL,DPL必須完全一致)
- IDTR [limt, base(線性地址)]
- IDT
- Task-gate descriptor
- Interrupt-gate descriptor (調用時中斷會被禁止)
- Trap-gate descriptor (CPU不會禁止或打開中斷, 保留原來樣子)
Paste_Image.png
- 硬件中斷開始過程中:CPU會根據CPL和中斷服務例程的段描述符的DPL信息確認是否發生了特權級的轉換。比如當前程序正運行在用戶態,而中斷程序是運行在內核態的,則意味著發生了特權級的轉換,這時CPU會從當前程序的TSS信息(該信息在內存中的起始地址存在TR寄存器中)里取得該程序的內核棧地址,即包括內核態的ss和esp的值,并立即將系統當前使用的棧切換成新的內核棧。這個棧就是即將運行的中斷服務程序要使用的棧。緊接著就將當前程序使用的用戶態的ss和esp壓到新的內核棧中保存起來;
堆棧棧變化示意圖
中斷發生時實施特權檢查的過程