中斷是否用於表示輸出已準備好或輸入已完成?
作業系統概念 說:
在 I/O 期間,各種設備控制器在準備好服務時引發中斷。這些中斷意味著
- 該輸出已完成,或
- 輸入數據可用,或
- 已檢測到故障。
中斷是否用於表示輸出已準備好或輸入已完成?
如果不是,它們是否需要以其他方式表示?
> > 該輸出已完成,或 > > >
是否中斷
$$ also $$用於表示輸出已準備好?
是的。
考慮寫入串列埠設備。該設備有一個稱為 FIFO 的接收緩衝區,用於儲存少量數據,例如 16 字節。
可能有一個中斷,當
- 緩衝區為空,輸出完成。這用於
tcdrain()
在 Linux 上實現。據稱“在更改影響輸出的參數時應使用此功能”。例如,當您想更改串列埠的“波特率”(頻率)時,您可以使用它等待所有緩衝數據都已使用目前波特率傳輸。- 一個字節已從緩衝區中傳出。現在有可用空間。設備現在已準備好讓 CPU 將另一個字節推入緩衝區。
> > 輸入數據可用,或 > > >
是否中斷
$$ also $$用來表示輸入已經完成?
也許。我不確定這裡有兩個不同的東西,至少在我的例子中。
考慮從串列埠設備讀取。該設備有一個稱為 FIFO 的發送緩衝區,用於儲存少量數據,例如 16 字節。
當 FIFO 從輸入中收集到至少一個字節時,設備會發送中斷。例如,它可能會在連接到 CPU 的線路上從低電壓變為高電壓。
CPU 可以通過從 IO 埠或 IO 記憶體讀取來消耗緩衝區中的字節。
旁注:可能允許此類事務比從系統 RAM 讀取花費的時間更長。為此,IO 設備必須在匯流排上插入“等待狀態”。即有一個短暫的握手,在 IO 設備設置“數據就緒”位之前可能需要幾個匯流排頻率週期。寫入 IO 埠/IO 儲存器時,同樣可以應用等待狀態。但是,等待狀態僅用於覆蓋不同設備之間已知的操作頻率/延遲差異。它們不用於等待外部輸入或輸出。這是因為它們阻止 CPU 繼續執行任何其他操作。
因此,當輸入可用時,會發出中斷信號。如果您願意,您可以在 CPU 讀入輸入字節時說輸入“完成”。但是不需要中斷來發出信號。就像不需要中斷來發出從記憶體讀取完成的信號一樣。
輸入緩衝區已滿的情況實際上更像是錯誤情況 - 它表明緩衝區溢出。設備確實可以記錄這種情況,從而使作業系統能夠檢測到錯誤。但是,我認為沒有理由專門為溢出發送中斷。因為當輸入可用時,設備可能已經發送了中斷。
這是一件好事,因為答案是肯定的。
也就是說,確切的答案取決於您要詢問的確切中斷。讓我們以 SPI 埠和 DMA 為例。SPI 是一個雙向串列介面。
例如,DMA 中斷通常會標記所謂的水位。當 DMA 緩衝區已滿、“幾乎已滿”(例如 3/4)、“幾乎為空”(例如 1/4)以及完全為空時,您將遇到中斷。
對於 SPI 埠,您將有兩個 DMA 通道。一個將處理來自外部設備的數據,另一個將處理要從您的電腦發送到設備的數據。
因此,當輸出 DMA 通道中斷指示緩衝區為空時,表示輸出已完成。當輸入 DMA 通道中斷指示緩衝區不為空時,表示輸入數據可用。