`
cloudtech
  • 浏览: 4619036 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

swtich_to宏分析 ------ 内联汇编翻译成标准汇编

 
阅读更多

内敛汇编版本的switch_to

#define switch_to(prev, next, last)/
do {/
/*/
* Context-switching clobbers(彻底击败) all registers, so we clobber/
* them explicitly, via unused output variables./
* (EAX and EBP is not listed because EBP is saved/restored/
* explicitly for wchan access and EAX is the return value of/
* __switch_to())/
*//
unsigned long ebx, ecx, edx, esi, edi;/
/
asm volatile("pushfl/n/t"/* save flags *//
"pushl %%ebp/n/t"/* save EBP *//
"movl %%esp,%[prev_sp]/n/t"/* save ESP */ /
"movl %[next_sp],%%esp/n/t"/* restore ESP */ /
"movl $1f,%[prev_ip]/n/t"/* save EIP *//
"pushl %[next_ip]/n/t"/* restore EIP *//
"jmp __switch_to/n"/* regparm call *//
"1:/t"/
"popl %%ebp/n/t"/* restore EBP *//
"popfl/n"/* restore flags *//
/
/* output parameters */ /
: [prev_sp] "=m" (prev->thread.sp),/
/*m表示把变量放入内存,即把[prev_sp]存储的变量放入内存,最后再写入prev->thread.sp*//
[prev_ip] "=m" (prev->thread.ip),/
"=a" (last), /
/*=表示输出,a表示把变量last放入ax,eax = last*/ /
/
/* clobbered output registers: *//
"=b" (ebx), "=c" (ecx), "=d" (edx),/
/*b 变量放入ebx,c表示放入ecx,d放入edx,S放入si,D放入edi*//
"=S" (esi), "=D" (edi)/
/
/* input parameters: *//
: [next_sp] "m" (next->thread.sp),/
/*next->thread.sp 放入内存中的[next_sp]*//
[next_ip] "m" (next->thread.ip),/
/
/* regparm parameters for __switch_to(): *//
[prev] "a" (prev),/
/*eax = prev edx = next*//
[next] "d" (next)/
/
: /* reloaded segment registers *//
"memory");/
} while (0)

标准汇编版本的switch_to:

1 把prev和next分别保存在寄存器中,即寄存器传参

movl prev,%eax

movl next,%edx

2 把eflags和ebp保存在当前的堆栈中

pushfl

pushl %ebp

3 把esp的内容保存到prev->thread.esp中,以使该字段指向prev内核栈的栈顶

movl %esp,484(%eax)

注:484(%eax) ,表示内存但愿的地址=(%eax) + 484

4 把next->thread.sp装入esp,内核开始在next的指令空间中操作,这条指令完成了进程之间的切换。

可以会想thread_info数据结构,内核栈和进程描述符组成的8K的数据结构

movl 484(%edx),%esp

5 把标记为1f的地址存入prev->thread.eip,即被替换出的进程在下次被schedule()选择执行时,从这条指令开始执行

movl $1f,480(%eax)

6 把next->thread.eip(绝大多数情况是一个被标记为1的地址)的值压入next的内核栈

pushl 480(%edx)

7 跳到__swtich_to() c语言函数开始执行

jmp __swtich_to

8 这里被进程next替换的进程prev再次获得CPU:它执行一些保存eflags和ebp的寄存器内容指令,这两条指令的第一条指令被标记为1(这是《深入理解unix》书上说的)。感觉从__swtich_to返回时ip已经指向了next的第一条指令,因为在执行ret指令的时候,把sp处保存的next->ip弹出赋给了next的eip,所以书上说prev再次获得cpu应该是不对的。

1:

pop %ebp

popfl

从标号1:开始已经进入了next的指令空间,可以这么理解1:就是next进程的第一条指令,执行

pop %ebp

popfl

后完成了最后的切换,即栈和状态字的恢复,恢复成next的堆栈基址和状态字。

个人理解:linux里面的每个进程(新创建的进程除外)的第一条指令应该都是

1:

pop %ebp

popfl

每个进程一开始全是执行这两条指令,之后才各自干自己的事去。

分享到:
评论

相关推荐

    扩展练习Challenge-杨添宝1

    其中切换到用户模式调用了函数 lab1_switch_to_user,写出它的代码如下:这段代码完全由扩展 GCC 内联汇编来实现,volatile 保证 as

    MASM宏相关汇编语言源代码,例如:斐波那契数列(宏嵌套),测量代码段的大小等

    MASM宏相关汇编语言源代码,包括:缓冲区对齐计算器,实现宏开关(.switch .case .endswitch),RGB,宏用于在一行代码中包含所有 API 库,宏用于将所有代码段放在单个文件夹,测量代码段的大小,IPADDR 和 PORTNR ...

    C++大学教程

    1.6 机器语言、汇编语言和高级语言--------------------------------------5 1.7 C语言与C++的历史--------------------------------------------------6 1.8 C++标准库--------------------------------------...

    C语言入门经典(第4版)--源代码及课后练习答案

    原书名: Beginning C: From Novice to Professional, Fourth Edition 原出版社: Apress 作者: (美)Ivor Horton 译者: 杨浩 出版社:清华大学出版社 ISBN:9787302170839 上架时间:2008-4-15 出版日期:2008 年4...

    宋劲彬的嵌入式C语言一站式编程

    5. C内联汇编 6. volatile限定符 20. 链接详解 1. 多目标文件的链接 2. 定义和声明 2.1. extern和static关键字 2.2. 头文件 2.3. 定义和声明的详细规则 3. 静态库 4. 共享库 4.1. 编译、链接、运行 4.2. 动态链接的...

    Visual C++ 2005入门经典--源代码及课后练习答案

    他曾在IBM工作多年,能使用多种语言进行编程(在多种机器上使用汇编语言和高级语言),设计和实现了实时闭环工业控制系统。Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工...

    C++大学教程,一本适合初学者的入门教材(part1)

    6 机器语言、汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++标准库 1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 ...

    语言程序设计课后习题答案

    面向对象的软件工程是面向对象方法在软件工程领域的全面应用,它包括面向对象的分析(OOA)、面向对象的设计(OOD)、面向对象的编程(OOP)、面向对象的测试(OOT)和面向对象的软件维护(OOSM)等主要内容。...

    C++大学教程,一本适合初学者的入门教材(part2)

    6 机器语言、汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++标准库 1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 ...

    Linux c编程一站式学习

    4.4. switch 语句...............................................47 第 5 章 深入理解函数...........................................50 5.1. return 语句...............................................50 ...

    高质量C_C++编程指南

    4.6 SWITCH 语句 .............................................................................................................. 30 4.7 GOTO 语句............................................................

Global site tag (gtag.js) - Google Analytics