原因是什麼?我已經看到在MIPS上下文切換也有一些特殊的寄存器被存儲到堆棧並從堆棧恢復。實際上,我想知道當線程切換當前線程到x86程序集中的新線程時,堆棧幀如何工作。我已經閱讀http://en.wikipedia.org/wiki/Setcontext和一些其他文章。我不知道發生了什麼爲什麼%ebx%esi%edi%ebp這些寄存器在x86彙編中的線程切換時被壓入堆棧
0
A
回答
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其實就是等。
要記住的重要一點是,當線程切換髮生時,絕對一切都會被推送到堆棧。
相關問題
- 1. 這些寄存器爲什麼被推入堆棧?
- 2. 堆棧上EBP寄存器的大小?
- 3. 使用ebp/esp與edi/esi
- 4. 爲什麼參數存儲在寄存器中而不是x86-64彙編中的堆棧上?
- 5. 彙編寄存器esp和ebp
- 6. x86彙編,堆棧推入指令
- 7. 錯誤組裝'push [ebp + 12] [edi] [esi]'
- 8. PIC寄存器(%ebx)是做什麼的?
- 9. ARM彙編,POP堆棧和存儲在寄存器
- 10. x86彙編:爲什麼我需要堆棧框架?
- 11. 「leal 0x10(%ebx),%eax」x86彙編指令中的0x10是什麼?
- 12. x86彙編打印寄存器ascii
- 13. x86彙編寄存器地址
- 14. 什麼是ESP和EBP寄存器?
- 15. 爲什麼在FreeBSD中重置堆棧指針寄存器?
- 16. x86彙編語言,使用ebx和bh
- 17. X86嵌入式彙編,訪問寄存器的特定部分
- 18. 從MIPS切換到x86彙編時應該知道什麼?
- 19. 內聯彙編錯誤:垃圾`-4(%EBP) '寄存器後
- 20. 爲什麼VC++ 2010經常使用ebx作爲「零寄存器」?
- 21. x86彙編中的序言和推送被調用者保存寄存器
- 22. 從cmp 0x4(%esi),%ebx彙編指令表示的0x4是什麼意思?
- 23. 爲什麼gdb中沒有%ebp寄存器?
- 24. 將XMM寄存器推入堆棧
- 25. 嘗試重新使用寄存器x86彙編時發生Segfault
- 26. XOR寄存器,寄存器(彙編)
- 27. Ebp,esp和與nasm彙編的堆棧幀
- 28. 裝配 - 寄存器被推入堆棧後的參數更改
- 29. x86彙編代碼把字符串中的EAX寄存器
- 30. Intel x86彙編語法寄存器中的括號
http://stackoverflow.com/questions/4429398/why-does-windows64-use-a-different-calling-convention-from-all-other-oses-on-x86/4438515有一些關於「爲什麼「在歷史背景下以事物的方式完成事情。 –
請注意,對於Microsoft工具集,「堆棧框架」是可選的。有一個編譯器選項可禁用堆棧幀指針,這允許ebp用於一般目的(它仍然需要由被調用者保存)。 – rcgldr