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

学习笔记

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

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

  • 1、当前程序、任务、或者过程执行一个将控制转移到GDT内某个TSS描述符的jmp或者call指令;
举例,内核程序 通过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

  • 2、当前程序、任务、或者过程执行一个将控制转移到GDT或者当前LDT内某个任务门描述符的jmp或者call指令;
举例,用户程序 通过 调用门 显示 字符串
 call far [fs:PrintString]
  • 3、 一个异常或者中断发生时,中断号指向中断描述表内的任务门;
  • 4、在EFLAGS寄存器的NT位置位的情况下,当前任务执行了一个iret指令;

CALL 与 栈的示意图

  • 32位相对近调用,只压入EIP寄存器
|        |
|--------|
|   EIP  |
|--------|
|        |

栈的示意图
  • 32位远调用,要入依次压入CS和EIP(通过调用门实施的控制转移一定是远转移,要压入CS和EIP
|         |
|---------|
| 0  | CS |
|---------|
|   EIP   |
|-------- |
|         |

栈的示意图
  • 假设还带参数,栈的示意图
PUSH 参数1
PUSH 参数2
PUSH 参数3
CALL 调用门


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

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

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

CALL

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

  • 1、分配内存给特权栈(程序员自己编程实现);
  • 2、使用目标代码段的DPL(新的CPL,假设为 n),选择特权级栈,栈段选择子SSn,栈指针ESPn
  • 3、栈的切换由处理器固件自动完成;
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 返回

  • 近返回 ret 参数个数*4 (丢弃相应个数的参数)
举例:子程序load_relocate_program  

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

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

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

  • 远返回 iretd : 32位模式下,iretiretd是相同的
举例:子程序 terminate_current_task

terminate_current_task:          
      
        ...
.b1:    
        ...

        iretd

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

JMP

  • 如果通过JMP FAR发起调用门控制转移,那么既没有特权级的变化,也不需要切换栈。

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

  • 内核程序 切换到 用户程序(位于内核程序c15_core.asm
call far [es:ecx+0x14]  
  • 用户程序 切换回 内核程序(位于用户程序c15.asm
 call far [fs:TerminateProgram] 
  • CALL指令切换任务过程中:TSS示意图


    使用CALL指令 从 程序管理器 切换到 用户程序 后的TSS示意图.png

JMP

  • 内核程序 切换到 用户程序(位于内核程序c15_core.asm
 jmp far [es:ecx+0x14] 
  • 用户程序 切换回 内核程序(位于用户程序c15.asm
 call far [fs:TerminateProgram] 
  • JMP指令切换任务过程中:TSS示意图


    使用 JMP 指令 从 程序管理器 切换到 用户程序 后的TSS 示意图.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356