[049][x86汇编语言]控制转移到其他任务 jmp/call

2018-07-08  本文已影响12人  AkuRinbu

学习笔记

《x86汇编语言:从实模式到保护模式》
https://www.jianshu.com/p/d481cb547e9f

处理器用以下四种方法将控制转移到其他任务:

举例,内核程序 通过TSS 切换任务
;32位间接远调用指令CALL                                 
call far [es:ecx+0x14]  ;执行任务切换
                        ;ECX指向要切换任务(用户程序)的TCB
                        ;从TCB中取出TSS基地址、TSS选择子
                        ;CPU发现这是TSS选择子,就知道要执行任务切换
                        ;新任务的TSS完整内容在子程序load_relocate_program中已经填写完毕

https://www.jianshu.com/p/a286eceb0a10

举例,用户程序 通过 调用门 显示 字符串
 call far [fs:PrintString]

CALL 与 栈的示意图

|        |
|--------|
|   EIP  |
|--------|
|        |

栈的示意图
|         |
|---------|
| 0  | CS |
|---------|
|   EIP   |
|-------- |
|         |

栈的示意图
PUSH 参数1
PUSH 参数2
PUSH 参数3
CALL 调用门


这四条语句执行完后的栈的示意图:

|         |
|---------|
|  参数1  |
|---------|
|  参数2  |
|---------|
|  参数3  |
|---------|
| 0  | CS |
|---------|
|   EIP   |
|-------- |
|         |

P.248 14.5.1 通过调用门转移控制的完整过程

CALL

不同特权级间控制转移,要实施栈切换:

PUSH 参数1
PUSH 参数2
PUSH 参数3
CALL 调用门


这四条语句执行完后的栈的示意图:

|---------|
| 0  | SS |
|---------|
|   ESP   |
|-------- |
|  参数1  |
|---------|
|  参数2  |
|---------|
|  参数3  |
|---------|
| 0  | CS |
|---------|
|   EIP   |
|-------- |
|         |

注意:这个示意图本质上是新栈的示意图,
SS 以及ESP压入这个新栈之后,
3个参数才会依次从旧栈被复制到新栈,
紧接着才是CALL指令隐含的CS以及EIP的压入。

相同特权级间的控制转移

PUSH 参数1
PUSH 参数2
PUSH 参数3
CALL 调用门


这四条语句执行完后的栈的示意图:

|-------- |
|  参数1  |
|---------|
|  参数2  |
|---------|
|  参数3  |
|---------|
| 0  | CS |
|---------|
|   EIP   |
|-------- |
|         |

注意:因为这里是相同特权级之间的转移控制,
所以不存在新栈旧栈的问题,
就只有一个栈,
CALL隐含的压入CS以及EIP而已。

call 返回

举例:子程序load_relocate_program  

load_relocate_program:      ;加载并重定位用户程序
                            ;PUSH 参数1
                            ;PUSH 参数2
                            ;PUSH 参数3
    .... ....
    .... ....

  ret 3*4                   ;丢弃调用本过程前压入的参数 

https://www.jianshu.com/p/b914ac0380dc

举例:子程序 terminate_current_task

terminate_current_task:          
      
        ...
.b1:    
        ...

        iretd

https://www.jianshu.com/p/919292c53a8a

JMP

P.297 15.5 处理器在实施任务切换时的操作

任务切换过程中NT位、B位以及TSS指针域变化规则

https://www.jianshu.com/p/44c9434b2c95

将控制转移到GDT内某个 TSS描述符 的jmp或者call指令

293页

  • 当执行任务切换时,处理器用得到的选择子访问GDT,一旦处理器发现那是一个TSS描述符,就知道应该执行任务切换的操作;
  • 首先,因为当前正在执行的任务是由任务寄存器TR指示的,所以,处理器要把每个寄存器的“快照”保存到由TR指向的TSS中;
  • 然后,处理器用指令中给出的TSS选择子访问GDT,取得新任务的TSS描述符,并从该TSS中恢复各个寄存器的内容,包括通用寄存器、标志寄存器EFLAGS、段寄存器、指令指针寄存器EIP、栈指针寄存器ESP,以及局部描述符表寄存器LDTR等等;
  • 最终,任务寄存器TR指向新任务的TSS,而处理器旋即开始执行新的任务。

CALL

call far [es:ecx+0x14]  
 call far [fs:TerminateProgram] 

JMP

 jmp far [es:ecx+0x14] 
 call far [fs:TerminateProgram] 
上一篇 下一篇

猜你喜欢

热点阅读