鐵人賽
建議先觀看昨日 PLIC 介紹,會較恰當喔。
今日來介紹 AIA(Advanced Interrupt Architecture) 架構,如果觀看的人以為筆者是要介紹 AI 人工智慧,或甚麼深度學習巴拉巴拉之類的,那可能走錯棚了,請右轉離開,感謝提高點閱率XD,這個系列是要介紹 interrupt 的,所以目的是甚麼請先看清楚。
不定時更新 based on Version 1.0-RC3
AIA code 目前 upstream 已經到第六版啦,可能再改個幾版就正式合進 kernel 了,可以透過前方連結來看看目前的狀態唷
一開始先來講述 RISC-V AIA(Advanced Interrupt Architecture)的目標:
AIA 主要是關注高性能的 RISC-V 系統的需求,目前還未定義以下 interrupt 處理特性的支援,有些特性是有助於 real time(實時)系統,但不太適合高速處理的處理器,如下所示:
在目前版本當中,RISC-V AIA 可支援 16,384個 harts 的對稱多處理器(SMP)系統,如果 harts 是64位(RV64)且實現了 hypervisor extension,並且 AIA 的所有功能都已實作,那麼對於每個實體 hart,最多可能有63個虛擬 hart 和數千個額外的閒置(已交換出的)虛擬 hart,其中每個虛擬 hart 都直接控制一個或多個實體設備。
下圖為數量的相關限制
在完全支持 MSI 系統中,每個 hart 都有 IMSIC,可用來控制 external interrupt,相反的,傳統的 interrupt ,hart沒有IMSIC。通常較大的系統,如 PCI 設備的系統,通常會給 hart 提供 IMSIC,從而完全支援 MSI;而許多較小的系統可能仍然適合使用 wire interrupt 和沒有 IMSIC 的簡單 hart。
假設沒有 IMSIC,則會用 APLIC(Advanced Platform-Level Interrupt)
替代,在此情況下,APLIC 會當作 interrupt 控制中心,external interrupt 會透過專用路線將 interrupt 傳遞給 hart。
此外,即使 hart 有實現 hypervisor extension,如果沒有 IMSIC,目前 AIA 不支援 external interrupt 直接向 VM 發送 interrupt。相反的需要將 interrupt 送到相關的 hypervisor,hypervisor才可以將virtual interrupt 送給 VM。
下圖為傳統的 wired interrupt 傳送給 hart,不支援 MSI
為了能夠接收(message-signaled interrupt)MSI,每個 hart 會需要有 IMSIC 如下圖所示。
從根本上講,MSI 只是一種對特定的記憶體寫入,硬體接受該地址表示為 interrupt
因此,每個 IMSIC 在機器的地址空間中被分配了一個或多個不同的地址,當有東西對這些地址進行寫入時,接收的 IMSIC 就表示該行為為 external interrupt。
所有 IMSIC 在機器的實體地址空間中都有唯一的地址,所以每個 IMSIC 都可以接收 MSI。
IMSIC 針對 machine level 和 supervisor level 有獨立的地址,部分原因為通過不同地址寫入的權限,可以給予或拒絕每個級別發出 interrupt 信號的能力,另外的原因則為可以更好的支援虛擬化。
hart 的 MSI 紀錄在 IMSIC 的 interrupt file 當中,該 file 主要紀錄 interrupt pending bit 和 interrupt enable bit。
當 risc-v 系統中 hart 具有 IMSIC,且具有 APLIC時, APLIC 的角色將有所改變。
APLIC 會將所有 wired interrupt 轉換成 MSI,然後通過 IMSIC 送到 hart(如果沒有 IMSIC 則由 APLIC 充當,但只能使用 wired interrupt 不能用 MSI)。
如果 risc-v hart 實作了 hypervisor extension,IMSIC 可能可以額外提供 guest interrupt file,用來向虛擬機提供的 interrupt。
local interrupt
global interrupt
local interrupt 仍然包含在 hart 中,因此 timer and software 不會通過 APLIC 以及 IMSIC。
RISC-V privileged 架構為每個 hart 上的 interrupt cause 定義了不同的 ID number ,這是當 trap 發生時自動寫入 mcause
或是 scause
的 0 到 15 number 大於 16 則可自行定義,
而 AIA 進一步定義 16~23 和 32~47,而 23~31 的 number 以及大於 48 的 number 也是可自行定義使用
下圖為此次 AIA 主要的interrupt ID
大多數的 I/O 設備的 interrupt 是由 external interrupt controller(外部中斷處理器,可能是 IMSIC 或是APLIC )傳送到 hart
local interrupt 的定義及處理則在後續會說明。
AIA 定義了兩個 extension 名稱用於 risc-v ISA 分別為 Smaia 以及 Ssaia,一個用於 machine level 另一個則用於 supervisor level,對於 machine level extension, Smaia 包含 AIA 所附加的 CSR 以及相對應的 interrupt 行為,覆蓋所有特權級別。對於 supervisor level extension 基本 Ssaia 與 Smaia 相同,但排除 machine level 的 CSR。
紀錄一下相關縮寫
該章節主要做一些基本介紹,如: IMSIC、MSI、APLIC 之類的,看完後面的章節在看前面會比較有感覺,這邊很單純簡單介紹一些而已,看不懂的部分,後面幾章也有比較詳細的說明,那就改天再見~