Boot And Other

  1. **Cdecl **(函数调用)
低位地址
局部变量
上一层[ebp] ------ [ebp] pushl %ebp; movl %esp, %ebp
返回地址 (call 指令)
参数1
参数2
...
高位地址 (栈底)

段机制

Boot And Other_第1张图片
Paste_Image.png
  • GDTR 48位 [limit(bytes), base (物理地址)]
  • GDT 64位
Boot And Other_第2张图片
Paste_Image.png
  • Selector
Boot And Other_第3张图片
Paste_Image.png
  • 关于权限
    • 数据段选择子(DS, SS等)里的请求特权级(Requested Privilege Level, RPL)
    • CS里的当前特权级(Current Privilege Level, CPL)
    • 段描述符里的描述符特权级(Descriptor Privilege Level, DPL)
    • 当描述符被加载时:
Boot And Other_第4张图片
Paste_Image.png

(SS要求CPL,RPL,DPL必须完全一致)

  • IDTR [limt, base(线性地址)]
  • IDT
    • Task-gate descriptor
    • Interrupt-gate descriptor (调用时中断会被禁止)
    • Trap-gate descriptor (CPU不会禁止或打开中断, 保留原来样子)
Boot And Other_第5张图片
Paste_Image.png
  • 硬件中断开始过程中:CPU会根据CPL和中断服务例程的段描述符的DPL信息确认是否发生了特权级的转换。比如当前程序正运行在用户态,而中断程序是运行在内核态的,则意味着发生了特权级的转换,这时CPU会从当前程序的TSS信息(该信息在内存中的起始地址存在TR寄存器中)里取得该程序的内核栈地址,即包括内核态的ss和esp的值,并立即将系统当前使用的栈切换成新的内核栈。这个栈就是即将运行的中断服务程序要使用的栈。紧接着就将当前程序使用的用户态的ss和esp压到新的内核栈中保存起来;
Boot And Other_第6张图片
堆栈栈变化示意图
Boot And Other_第7张图片
中断发生时实施特权检查的过程

你可能感兴趣的:(Boot And Other)