亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4045 | 回復(fù): 3
打印 上一主題 下一主題

linux內(nèi)核進(jìn)程切換代碼分析 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-01-05 09:52 |只看該作者 |倒序?yàn)g覽
  1. #define switch_to(prev,next,last) do{

  2.        asm volatile {"pushl %%esi\n\t"

  3.                          "pushl %%edi\n\t"

  4.                          "movl %%esp,%0\n\t"

  5.                          "movl %3,%%esp\n\t"

  6.                          "movl $1f,%1\n\t"

  7.                          "pushl %4\n\t"

  8.                          "1\t"

  9.                          "popl %%ebp\n\t"

  10.                          "popl %%edi\n\t"

  11.                          "popl %%esi\n\t"

  12.                          :"m="  (prev->thread.esp),"m" (prev->thread.eip), \

  13.                           "b"(last)

  14.                          :"m" (next->thread.esp),"m" (next->thread.eip),

  15.                            "a"(prev), "d"(next),

  16.                            "b"(prev));
復(fù)制代碼
其中%0和%1都在內(nèi)存中,分別為prev->thread.esp和prev->thread.eip,而%2則與寄存器EBX結(jié)合,對應(yīng)于參數(shù)中的last。其中%3和%4在內(nèi)存中,分別為next->thread.esp和next->thread.eip,%5、%6和%7分別與寄存器EAX、EDX和EBX結(jié)合,分別對應(yīng)于prev,next,prev.

如圖所示,A為此時(shí)正運(yùn)行的進(jìn)程(prev),B為待切換的進(jìn)程(next)。切換過程一共分為四步:

第一步:即movl %%esp,%0也就是將寄存器esp中的值保存在進(jìn)程A的thread.esp中。

第二步:即movl %3,%%esp也就是將進(jìn)程B的thread.esp的值賦給寄存器esp。(實(shí)際上這個(gè)值就
           是上一次從B中切換走的時(shí)候執(zhí)行的第一步的結(jié)果。為了要返回,必須為以后考慮周全。)

第三步:即movl $1f,%1其中1f就是說程序后面標(biāo)號(hào)為1的地方,將標(biāo)號(hào)為1的地方的代碼的地址保存

           到A的thread.eip中。

第四步:即pushl %4,將進(jìn)程B的thread.eip的值壓棧,此時(shí)的esp指向已是進(jìn)程B的堆棧。(實(shí)際上此時(shí)的thread.eip就是上一次從B中切換走的時(shí)候第三步執(zhí)行的結(jié)果,即標(biāo)號(hào)一得位置。所以任何進(jìn)程恢復(fù)運(yùn)行,首先肯定是執(zhí)行的標(biāo)號(hào)1的代碼。)

    這里要說明的是,pushl %4后面的一句代碼是調(diào)轉(zhuǎn)jmp __switch_to 而__switch_to是個(gè)函數(shù),他執(zhí)行完成以后會(huì)有一個(gè)ret的操作,即將棧中的第一個(gè)地址作為函數(shù)返回的地址,所以就會(huì)跳到標(biāo)號(hào)1的地方去執(zhí)行代碼了。

    由于__switch_to的代碼在schedule()中,而shedule()函數(shù)又在其他系統(tǒng)調(diào)用函數(shù)中,比如sys_exit()中,所以先返回到調(diào)用B進(jìn)程上次切換走時(shí)的schedule()中,然后返回到調(diào)用schedule()的系統(tǒng)調(diào)用函數(shù)中,最后系統(tǒng)調(diào)用又是在用戶空間調(diào)用的,所有返回到系統(tǒng)調(diào)用的那個(gè)地方,接著執(zhí)行用戶空間的代碼。這樣就徹底的回到了B進(jìn)程。注意由于此時(shí)的返回路徑是根據(jù)B堆棧中保存的返回地址來返回的,所以肯定會(huì)返回到B進(jìn)程中。



本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/ywf861029/archive/2011/01/05/6117145.aspx

評分

參與人數(shù) 1可用積分 +24 收起 理由
Godbach + 24 多謝分享

查看全部評分

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-01-05 09:54 |只看該作者
自己先頂一個(gè){:3_180:}

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
3 [報(bào)告]
發(fā)表于 2011-01-05 10:03 |只看該作者
LZ 博客上很多好文章啊。歡迎多來內(nèi)核版交流。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-01-05 13:42 |只看該作者
支持,學(xué)習(xí)一下
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP