免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: scutan
打印 上一主题 下一主题

关于switch_to()这个函数的疑惑 [复制链接]

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
11 [报告]
发表于 2011-10-17 09:10 |只看该作者
本帖最后由 embeddedlwp 于 2011-10-17 09:14 编辑

回复 9# asuka2001


    您帖的是汇编版的,
  1. #define switch_to(prev,next,last) do {                                        \
  2.         unsigned long esi,edi;                                                \
  3.         asm volatile("pushfl\n\t"                                        \
  4.                      "pushl %%ebp\n\t"                                        \
  5.                      "movl %%esp,%0\n\t"        /* save ESP */                \
  6.                      "movl %5,%%esp\n\t"        /* restore ESP */        \
  7.                      "movl $1f,%1\n\t"                /* save EIP */                \
  8.                      "pushl %6\n\t"                /* restore EIP */        \
  9.                      "jmp __switch_to\n"                                \
  10.                      "1:\t"                                                \
  11.                      "popl %%ebp\n\t"                                        \
  12.                      "popfl"                                                \
  13.                      :"=m" (prev->thread.esp),"=m" (prev->thread.eip),        \
  14.                       "=a" (last),"=S" (esi),"=D" (edi)                        \
  15.                      :"m" (next->thread.esp),"m" (next->thread.eip),        \
  16.                       "2" (prev), "d" (next));                                \
  17. } while (0)
复制代码
请教从这个嵌入式汇编中哪里看出的
  1. movl prev, %eax                // prev保存在eax,即(%eax)代表prev->
  2. movl next, %edx                // next保存在edx,即(%edx)代表next->
复制代码
请指点!

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
12 [报告]
发表于 2011-10-17 09:15 |只看该作者
本帖最后由 asuka2001 于 2011-10-17 09:16 编辑

回复 11# embeddedlwp
这是ULK3的读书笔记,你可以查看ULK3 的P112,毕竟其实我对汇编不太熟悉,ULK3当中有对switch_to的分析!我只是在它的分析基础上加了我自己的思考结果!

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
13 [报告]
发表于 2011-10-17 09:17 |只看该作者
回复 10# ruslin

非常感谢分享,谢谢!

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
14 [报告]
发表于 2011-10-17 09:20 |只看该作者
回复 12# asuka2001


    呵呵,确实是ULK3上这么写,所以大家都这么说,不过之前看论坛了别人也问过。大家谁会的说一下,这两句是怎么看出来的!

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
15 [报告]
发表于 2011-10-17 09:50 |只看该作者
回复 10# ruslin


    但是还是那个问题阿,比如:
    M——>A
    A——>B  此时A堆栈上%eax为A,%edx为B
    .......
    C——>A  当切换回来的时候,从1:开始执行,此时用的是A的内核堆栈,%eax还是A,那么怎么保存切换前那个C呢?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
16 [报告]
发表于 2011-10-17 11:25 |只看该作者
假设现在是从A跳转到C,在jmp _ _switch_to之前,CPU运行的应该算是A,之后就是代表C恢复运行。

在最后条指令 movl %eax,last中,这里的last就已经是C的局部变量last_C了,而非A的局部变量last。

而eax中保存的是A的局部变量prev,所以就把A的prev保存到了C的局部变量last中!

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
17 [报告]
发表于 2011-10-17 11:31 |只看该作者
回复 16# asuka2001


    请教 %eax是共用的吗,还是存在%eax_A,%eax_C

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
18 [报告]
发表于 2011-10-17 11:34 |只看该作者
回复 17# embeddedlwp

你先考虑清楚,栈和进程有关么,CPU的寄存器和进程有关么?

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
19 [报告]
发表于 2011-10-17 11:35 |只看该作者
回复 18# asuka2001


    每个进程不是都有属于自己的8KB内核栈吗?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
20 [报告]
发表于 2011-10-17 11:37 |只看该作者
回复 19# embeddedlwp

栈是和进程有关的,但是CPU的寄存器和进程无关!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP