2014-03-13 64 views
0

原因是什麼?我已經看到在MIPS上下文切換也有一些特殊的寄存器被存儲到堆棧並從堆棧恢復。實際上,我想知道當線程切換當前線程到x86程序集中的新線程時,堆棧幀如何工作。我已經閱讀http://en.wikipedia.org/wiki/Setcontext和一些其他文章。我不知道發生了什麼爲什麼%ebx%esi%edi%ebp這些寄存器在x86彙編中的線程切換時被壓入堆棧

+0

http://stackoverflow.com/questions/4429398/why-does-windows64-use-a-different-calling-convention-from-all-other-oses-on-x86/4438515有一些關於「爲什麼「在歷史背景下以事物的方式完成事情。 –

+0

請注意,對於Microsoft工具集,「堆棧框架」是可選的。有一個編譯器選項可禁用堆棧幀指針,這允許ebp用於一般目的(它仍然需要由被調用者保存)。 – rcgldr

回答

1

UNIX標準ABIs(Application Binary Interface)和作爲其中的一部分,C編程二進制接口實現,請參閱處理器特定的「補充」部分。

對於32位的x86,這是Intel386 Architecture Processor Supplement文件,並且(以及許多其他的東西)指定如何時使函數調用寄存器用於 - 特別是,呼叫者所屬被叫方擁有的寄存器之間的分離(即,如果功能選擇使用它們,哪些必須保存/恢復,哪些是劃痕)。

對於所有使用UN * X風格接口/ ELF二進制文件的體系結構,存在這樣的處理器補充文檔; Wikipedia page on ELF給出了許多針對除32位x86之外的CPU的「處理器補充」的指針。

0

堆棧幀和線程切換是無關的。每個線程都有自己的堆棧,每個堆棧都有自己的一組堆棧幀。線程切換過程的線沿線的雲: -

thread 1 interrupted 
cpu state is saved to thread 1 stack (cpu, fpu, sse, etc) 
stack pointer is changed to point to thread 2's stack 
cpu state is restored 
return from interrupt (getting return address from thread 2's stack!) 

這只是一個基本的輪廓,實際的實現將在那裏有更多的事情,比如,確定哪些線程2其實就是等。

要記住的重要一點是,當線程切換髮生時,絕對一切都會被推送到堆棧。

相關問題