我正在閱讀Nick Blundell編寫的「從頭開始編寫操作系統」一書。在其中一章中,解釋了我們如何從16位模式轉換爲32位模式。它說,在轉移到32位模式之前,我們應該確保所有在16位模式下的指令都在流水線內(CPU內部的指令流水線)執行。爲了實現這一點,它說,我們應該做出一個遠大的跳躍,導致管道沖洗,書中說這是完成目前在管道不同階段的所有指令。
但是我對流水線刷新的理解是刪除了由於程序流程改變而導致的來自指令流水線的條件分支之後的所有指令。
我對這些描述感到困惑,有人可以解釋在管道沖洗過程中發生了什麼。
此外,這本書說近旁跳可能不足以做管道沖洗。我也不明白這一點。x86從16位轉換到32位模式
0
A
回答
3
只要不執行那些指令,管道清洗就需要從管道清空預取和解碼/轉換的指令。這是在條件跳轉之後以及轉換到指令集必須使用與16位實模式不同的邏輯進行解碼的段之後所必需的。可用操作碼,分段模型和默認操作數/地址大小前綴位(僅舉幾例)可能存在差異。
有可能在處理器中優化近跳轉以便在解碼後立即從某個地址開始預取指令;實際上近遠跳變的唯一區別在於CS的顯式重載(並且設置了用於指令解碼的新策略),這可能被設計爲觸發流水線沖洗。
if(IsNearJump()) {
if(IsRelativeJump()) TemporaryEIP = EIP + Destination; //EIP is instruction following JMP instruction;
else TemporaryEIP == Destination;
if(!IsWithinCodeSegmentLimits(TemporaryEIP)) Exception(GP(0));
if(OperandSize == 32) EIP = TemporaryEIP;
else EIP = TemporaryEIP & 0xFFFF; //OperandSize == 16
//END
}
if(IsFarJump() && (PE == 0 || (PE == 1 && VM == 1)) { //real-address or virtual-8086 mode
TemporaryEIP = Destination.Offset; //Destination is ptr16:32 or [m16:32]
if(!IsWithinCodeSegmentLimits(TemporaryEIP)) Exception(GP(0));
CS = Destination.SegmentSelector; //Destination ptr16:32 [m16:32]
if(OperandSize == 32) EIP = TemporaryEIP; //Destination ptr16:32 [m16:32]
else /*OperandSize == 16*/ EIP = TemporaryEIP & 0xFFFF; //clear upper 16 bits;
//END
}
相關問題
- 1. X86切換到32位保護模式
- 2. 16位圖像轉換爲32位
- 3. 將16位轉換爲32位浮點
- 4. Python將32位轉換爲16位tiff
- 5. 8位到16位轉換
- 6. 如何從32位/ 24位從字節到16位轉換爲字節
- 7. 將12位int轉換爲16位或32位
- 8. .effmach x86無法從64位切換到32位
- 9. 位NASM 16和位32
- 10. 如何轉換位圖圖像的32位到16位色彩質量在C#
- 11. 轉換16位PCM到8位
- 12. 轉換波24位到16位
- 13. 使用Javascript將32位WAV轉換爲16位WAV
- 14. 將32位浮點轉換爲16位PCM範圍
- 15. 如何在C#中將16位'short'轉換爲32位整數?
- 16. 將32位實數轉換爲2x 16位字節
- 17. 將32位波形轉換爲16位波形
- 18. Naudio - 將32位wav轉換爲16位wav
- 19. 轉換一個32位的數字爲16位,
- 20. 音頻編碼與PCM轉換問題32位喲PCM 16位
- 21. Java中的24位到32位轉換
- 22. 簡單的32位到64位轉換?
- 23. 16 bpp到32 bpp轉換
- 24. x86 32位保護模式:從調用堆棧讀取?
- 25. 轉換16位C++內聯__asm到32位和刪除遠指針
- 26. 如何從基地32位轉換信息哈希到基地16
- 27. 將24位bmp轉換爲16位?
- 28. 8位至16位ALU轉換
- 29. DICOM將16位轉換爲8位
- 30. SIZEOF指針16位和32位
謝謝....但如果管道沖洗只能從管線中移除的說明,爲什麼書上說,它完成當前管道中的所有指令。 – sarthak 2015-02-12 07:54:30
管道沖洗AFAIK,必須意味着只清除管道中的_invalid_或潛在無效的指令。但是管道中也有有效的指示,這些指示意味着要完成。一種純粹推測的方法是,遠程調用將一個標識放置到流水線上,這實際上完成了所有指令直到遠程調用,將所有其他指令標記爲無效,並開始用與該流水線關聯的微代碼填充流水線遠調用。 – 2015-02-12 08:42:47