- **Cdecl **(函数调用)
低位地址 | |
---|---|
局部变量 | |
上一层[ebp] | ------ [ebp] pushl %ebp; movl %esp, %ebp
|
返回地址 | (call 指令) |
参数1 | |
参数2 | |
... | |
高位地址 (栈底) |
段机制
- GDTR 48位 [limit(bytes), base (物理地址)]
- GDT 64位
- Selector
- 关于权限
- 数据段选择子(DS, SS等)里的请求特权级(Requested Privilege Level, RPL)
- CS里的当前特权级(Current Privilege Level, CPL)
- 段描述符里的描述符特权级(Descriptor Privilege Level, DPL)
- 当描述符被加载时:
(SS要求CPL,RPL,DPL必须完全一致)
- IDTR [limt, base(线性地址)]
- IDT
- Task-gate descriptor
- Interrupt-gate descriptor (调用时中断会被禁止)
- Trap-gate descriptor (CPU不会禁止或打开中断, 保留原来样子)
- 硬件中断开始过程中:CPU会根据CPL和中断服务例程的段描述符的DPL信息确认是否发生了特权级的转换。比如当前程序正运行在用户态,而中断程序是运行在内核态的,则意味着发生了特权级的转换,这时CPU会从当前程序的TSS信息(该信息在内存中的起始地址存在TR寄存器中)里取得该程序的内核栈地址,即包括内核态的ss和esp的值,并立即将系统当前使用的栈切换成新的内核栈。这个栈就是即将运行的中断服务程序要使用的栈。紧接着就将当前程序使用的用户态的ss和esp压到新的内核栈中保存起来;