linux核心進程切換程式碼分析

來源:互聯網
上載者:User

#define switch_to(prev,next,last) do{

       asm volatile {"pushl %%esi/n/t"

                         "pushl %%edi/n/t"

 

                         "movl %%esp,%0/n/t"

                         "movl %3,%%esp/n/t"

                         "movl $1f,%1/n/t"

                         "pushl %4/n/t"

                         "1/t"

                         "popl %%ebp/n/t"

                         "popl %%edi/n/t"

                         "popl %%esi/n/t"

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

                          "b"(last)

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

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

                           "b"(prev));

}while(0)

其中%0和%1都在記憶體中,分別為prev->thread.esp和prev->thread.eip,而%2則與寄存器EBX結合,對應於參數中的last。其中%3和%4在記憶體中,分別為next->thread.esp和next->thread.eip,%5、%6和%7分別與寄存器EAX、EDX和EBX結合,分別對應於prev,next,prev.

,A為此時正啟動並執行進程(prev),B為待切換的進程(next)。切換過程一共分為四步:

第一步:即movl %%esp,%0也就是將寄存器esp中的值儲存在進程A的thread.esp中。

第二步:即movl %3,%%esp也就是將進程B的thread.esp的值賦給寄存器esp。(實際上這個值就

           是上一次從B中切換走的時候執行的第一步的結果。為了要返回,必須為以後考慮周全。)

第三步:即movl $1f,%1其中1f就是說程式後面標號為1的地方,將標號為1的地方的代碼的地址儲存

           到A的thread.eip中。

第四步:即pushl %4,將進程B的thread.eip的值壓棧,此時的esp指向已是進程B的堆棧。(實際上此時的thread.eip就是上一次從B中切換走的時候第三步執行的結果,即標號一得位置。所以任何進程恢複運行,首先肯定是執行的標號1的代碼。)

    這裡要說明的是,pushl %4後面的一句代碼是調轉jmp __switch_to 而__switch_to是個函數,他執行完成以後會有一個ret的操作,即將棧中的第一個地址作為函數返回的地址,所以就會跳到標號1的地方去執行代碼了。

    由於__switch_to的代碼在schedule()中,而shedule()函數又在其他系統調用函數中,比如sys_exit()中,所以先返回到調用B進程上次切換走時的schedule()中,然後返回到調用schedule()的系統調用函數中,最後系統調用又是在使用者空間調用的,所有返回到系統調用的那個地方,接著執行使用者空間的代碼。這樣就徹底的回到了B進程。注意由於此時的返迴路徑是根據B堆棧中儲存的返回地址來返回的,所以肯定會返回到B進程中。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.