簡體   English   中英

8086 中的中斷、指令指針和指令隊列

[英]Interrupts, Instruction Pointer, and Instruction Queue in 8086

假設向 8086 發出外部中斷請求。處理器將在完成當前正在執行的指令(如果有)后處理中斷。 在處理中斷之前,還將通過將數據壓入堆棧段來保存程序的狀態(PSW 標志、寄存器等)。

現在,大多數教程/文檔都描述指令指針也被壓入堆棧段,這沒關系,因為它指向代碼段中指令的下一個字節(就在發出中斷請求之前)。

但是指令隊列會發生什么? 在處理中斷請求時是否也被壓入堆棧段? 還是它的內容被清零了? 在這種情況下,指令指針是否應該遞減以便它可以指向代碼段中的先前指令(在中斷服務之后)?

IP 入棧

這里, After interrupt request實際上是指After interrupt request has been served 這張圖顯示的是在中斷請求到來之前,指令被緩存起來, IP指向CS內存段中下一條指令字節的地址 為了服務於中斷請求,寄存器的內容(包括 IP 和標志)被壓入堆棧段。 服務請求后,之前的內容被加載回來 - IP 仍然指向第 7 個字節(指令)的位置,隊列(緩存)為空。 這就是我的疑惑。 IP 是否遞減以指向 i1 其次,我們是否需要手動處理 IP(例如,在中斷時將其壓入堆棧)還是由中斷服務例程為我們處理? 請,任何幫助表示贊賞,謝謝!


注意: 指令隊列——8086 架構有一個六字節的預取指令流水線。 當執行單元正在執行當前指令時,總線接口單元會預先從內存中讀取最多六個字節的操作碼。

您不太清楚“指令隊列”的含義。

一個含義可能是“預取指令”。 實際上,處理器基於各種類型的分支預測算法,在分支之后或者不分支之后,在指令流中從最后完成的指令的點推測性地預讀。 由於這些是讀操作 ,如果處理器決定放棄當前指令“流”用於另一個(例如,中斷例程),則它只是忽略其預讀。

另一個含義可能是“部分執行的指令(在飛行中/在'管道中')”,這經常發生在超標量CPU上。 在異步中斷的情況下,處理器必須完成那些影響系統可見狀態的處理器(例如,已經提交了對寄存器或存儲器的寫入),並且可能會或可能不會完成其他指令,具體取決於特定處理器的設計者。 在同步陷阱的情況下,處理器必須完成影響狀態的指令,但只是放棄其余的(OP的短語是“隊列零”,其具有正確的概念但錯誤的措辭)。

[根據OP的要求添加我做的評論]:你說8086有一個6字節的預取“指令管道”(壞的術語恕我直言)。 可能有一個屬性,但這是實現的細節,並沒有充分的理由相信這是所有8086的屬性。 對於現代CPU,實現指令預取的方式僅取決於設計者的聰明才智。 關於所有你可以合理預測的是,會有一些預取方案,除了對性能的影響和有關自修改代碼的有趣規則之外,你很難在應用程序中檢測它的存在。

[回答OP的第二個問題]: 其次,我們需要手動處理IP(比如,在中斷時將其推入堆棧)還是中斷服務程序為我們處理這個問題?

對於任何類型的陷阱或中斷,存儲架構定義的狀態(“寄存器”,PC等)就足夠了。 對於許多處理器,硬件存儲架構狀態的關鍵子集就足夠了,讓中斷例程存儲(並最終恢復)其余的處理器。 因此,存儲整個狀態的責任在硬件和軟件之間分配(以節省硬件中的實現工作量)。

對於x86系列,通常指令指針(IP)和標志寄存器由硬件推送到當前堆棧,控制轉移到中斷,而中斷例程具有通常在操作中存儲其余寄存器的指令。系統定義的數據結構通常稱為“上下文塊”。 中斷例程完成其工作,並通過重新加載寄存器將控制返回給應用程序,然后使用特殊的IRET指令重新加載IP和標志,或者將控制轉移到選擇運行其他活動的OS調度程序,最終使用保存的上下文塊內容重新啟動應用程序。

一個非常快速的中斷例程可能會保存足夠的寄存器來完成其關鍵工作,然后在返回到中斷之前恢復這些寄存器。

  • 當發生中斷或陷阱時,CPU通過停止與高速緩存同步,直到所有掛起的高速緩存操作完成或被搶占為止。
  • 如果緩存加載已在進行中,則表示已完成,但隊列中等待的其他操作將被搶占。
  • 隊列存儲為緩存內部狀態的一部分,因此在恢復上下文時,搶占的操作將重新排隊。

8086 處理器有一個 6 字節的指令預取隊列。 要回答這個問題,當中斷發生時,程序計數器(指令指針)被壓入堆棧並丟棄隊列。 棘手的部分是內部程序計數器指向下一個要預取的字節,這與下一個要執行的字節不同。 解決方案是通過使用小常量表和尋址加法器減去隊列大小來校正程序計數器值。 對子程序調用和相對跳轉進行相同的更正,因為它們也需要真實的 PC 值。

引用8086專利第8欄第27行:

PC 不是真正的或真實的程序計數器,因為它不會,也不會在 CPU 內的任何其他寄存器中隨時維護實際執行點。 PC實際指向下一個要輸入隊列的字節。 每當需要相對跳轉或調用時,通過從 PC 減去隊列中仍未使用的已訪問指令數,即可按指令計算實際程序計數器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM