CPU檢測到中斷訊號時,怎麼知道是發給哪個程序的?

時間 2021-05-31 13:32:59

1樓:Sinaean Dean

中斷並不直接把資料送給使用者程序的,中斷通知的是驅動程式,驅動程式的做法也各不相同。簡單一點的裝置直接在驅動中快取資料,等使用者程序呼叫時給它。複雜一點的把資料交給上層協議棧,由協議棧來決定交給那個程序。

2樓:陳清揚

CPU檢測到中斷訊號時,怎麼知道是發給哪個程序的?題目的意思並不是「程序是中斷的接收者」,題目是想問,當OS收到中斷以後,如何知道當初是哪個程式導致的這個中斷。我覺得,大致來講,情況就是因中斷被儲存掛起的程序會根據中斷型別被加入對應的佇列,譬如等候IO的程序就被加入IO佇列,收到IO裝置完事的中斷以後從佇列中取出程序繼續執行即可。

是每次中斷只傳送1B資料(即,要花1024次中斷),才傳送完這1KB資料;還是只需1次中斷就在中斷服務程式中把這1KB的資料全部傳送完了?很多人在說DMA,但題目問明明就不是DMA。如果不用DMA的話,每次中斷傳多少第一取決於資料匯流排排程策略,第二取決於硬體本身的能力。

如果每次只傳乙個位元組,CPU則始終對資料匯流排有控制權,但是比較慢;如果一次傳乙個塊,匯流排會被部分占用或者完全占用,於是就需要一些排程。如果分塊來傳,每次具體能傳多少,則取決於硬體,譬如CPU每次記憶體讀寫的單位是乙個cache line,其他外部裝置對記憶體的讀寫自然也有他們自己的單位。

如果用DMA的話,根據資料匯流排的排程情況也有類似的不同的模式。既可以是一次傳一點點讓CPU隨時獲得排程權;也可以分塊傳,保證CPU當時不會競爭資料匯流排;也可以分塊傳但是讓CPU優先獲得資料匯流排,CPU不用的時候再DMA。分塊的話,DMA控制器裡會有暫存器來記錄起始位址、已經傳了多少、一共多少等等。

如果新換入CPU執行的程序的優先順序比之前那個程序的優先順序高的話,這種情況下,還能中斷正在執行的這個新程序麼?都有可能,取決於排程演算法的選擇。

3樓:孫建希

題主其實主要是不清楚程序與中斷的協調問題。

考慮場景:程序讀取外設,外設通過中斷通知cpu資料準備完畢。

1、程序read時,進入核心, 核心向裝置發起讀請求,由於裝置較慢,所以讀請求發起後,驅動程式員需要將cpu讓出。

2、通常驅動會在核心中維護乙個鍊錶,wait queue。將程序掛在該鍊錶中,然後交出cpu。

3、當裝置準備好資料後,會向cpu發起中斷。

4、cpu 通過讀取中斷控制器,查詢具體是哪個裝置發起的中斷。

5、最終我們編寫的驅動程式會被呼叫,此時可以完全在遮蔽中斷的情況下,將資料讀出。當然也可以開中斷情況下,通過核心執行緒等途徑去讀取。

6、不管如何,讀取完成後,驅動程式會通過wait queue將等待讀取完成的程序,重新設為run模式,下一次程序排程的時候,該程序就重新被喚起。read也就完成了。

你考慮的效能問題,不就是dma做的事嘛。為了不影響其他操作,linux kernel 驅動程式員要求,盡量不要hard irq 中太長時間。一定要最快速度開中斷。

第二個問題

read是系統呼叫,不是具體的指令。 read系統呼叫最後呼叫的是驅動的read操作。上文提到的進入wait queue,就是驅動read操作實現的。

而且系統read呼叫會阻塞程序,這一點是所有使用者態程式設計師都得知道的。

4樓:靈劍

題主應該先系統學一下微機原理相關的教材的,我說的簡單一點硬體中斷從來不是傳送給程序的,而是傳送給作業系統核心,由核心統一處理,而不關心當前正在執行的是哪個程序,不管哪個程序操作都是一樣的:儲存現場,進入核心,執行需要的操作,返回中斷前的現場,繼續程序執行。

CPU寫入外部裝置有兩種不同的方式,一種是直接操作硬體裝置暫存器,這一般是不需要中斷的,CPU在寫入乙個暫存器的時候會處於阻塞狀態,直到寫入完成之前不能繼續,因此通常只有處理非常少的資料的時候才會這樣做。另一種方式是使用DMA,DMA是乙個專用的外部裝置,CPU將需要傳送的資料提前在記憶體中準備好,然後設定DMA裝置的暫存器,讓DMA裝置從記憶體的指定位置開始,將記憶體中資料依次寫到對應位址的外部硬體暫存器裡,這樣在DMA寫入的同時CPU就可以做其他工作。DMA寫入完成後會產生乙個中斷通知CPU。

這些都和當前執行的程序無關。程序只是直接跟作業系統核心通訊,核心負責通過排程來通知程序操作是否完成之類的資訊。

再舉個詳細點的例子,比如某個程序要讀取乙個檔案,向核心傳送了乙個read的syscall呼叫,陷入核心,核心會設定DMA,然後把程序掛起。因為程序掛起了,核心另找了乙個程序切換進來執行。當DMA完成發生中斷的時候,不管當前執行的是哪個程序,都會直接通過中斷進入核心,這個過程外部執行的程序是察覺不到的,它在執行的途中被打斷然後凍結在了執行現場,就像時間停止了一樣(這就是「中斷」的含義),CPU開始執行核心中的中斷處理程式,核心通知之前掛起的程序操作已經完成,並且取消掛起,這時候這個程序是否會立即搶占進來,取決於優先順序,在Linux當中一般會把因為IO掛起的程序優先順序稍微調高一點讓它們立即搶占進來,提高IO效率;但如果不能搶占進來,就會恢復當前的程序的執行,等到高優先順序執行結束後,再讓之前掛起的程序切換進來繼續執行,這對於執行IO的程序來說是不可見的。

5樓:「已登出」

又乙個概念不明引起的問題。

中斷,在系統的不同設計者眼中完全不是乙個東西,這是為什麼大家對它有那麼多誤解,因為不少人把用於其他命名空間的概念直接用於你自己的命名空間了。

我們先看一張全景(示意)圖:

乙個系統的的中斷系統通常是類似這樣的組成,我們應該注意到,裝置眼中的中斷,中斷控制器眼中的中斷,還有CPU眼中的中斷,都不是同乙個概念。所以,當我們說「關中斷」一類的說法的時候,對它們三者也是不一樣的。

裝置的中斷,是裝置要產生乙個事件通知CPU,事件的產生的方法有很多,最簡單的是在一條訊號線上產生特定的電平(電平中斷,比如平時都是高電平,拉低了就表示有中斷了),或者產生一次電平變化(邊緣觸發中斷),複雜的可以很複雜,比如在匯流排上傳送特定訊息或者訊息序列。對裝置「關中斷」,指的僅僅是讓這個裝置不要再提供中斷訊號了,但如果中斷控制器已經獲得這個中斷訊號,這個中斷訊號還是會報到CPU上的。

中斷控制器,是對多個裝置的中斷進行取樣,排隊,分發的機制。對中斷控制器說:關中斷,是讓中斷控制器不要給CPU(或者上級)傳送中斷訊號了,裝置報不報訊號上來,這些訊號是否被排隊,那是另乙個問題。

最後,是對我們軟體程式設計師最熟悉的CPU了,CPU的中斷,是CPU核上有一條中斷線,當這條線加上合適的電平或者訊號,CPU核就會從當前的執行上下文中,直接跳轉到中斷處理程式中執行。在CPU的角度上關中斷,就是跟CPU說:就算現在你的中斷線上有中斷,也不要執行「跳轉到中斷處理程式」這個動作。

CPU能認識的就僅僅是中斷線和中斷處理程式這些概念。所謂執行緒,程序,軟中斷等概念,是軟體發明出來的,CPU是不認識的。所謂執行緒,本質上是儲存CPU執行狀態的一種形式,CPU的執行狀態,就是CPU的所有暫存器的內容的集合(包括用來控制中斷的暫存器),執行緒的作用就是可以把這些暫存器都儲存下來(其實還有軟體本身的堆疊等其他資訊,但我們這裡不關心軟體,先忽略),然後用另乙個儲存的狀態重新整理CPU的狀態,讓CPU感覺自己在執行到另乙個上下文上。

OS對CPU不斷進行狀態的切換,儲存上乙個狀態,載入下乙個執行緒的狀態,就實現執行緒切換了。至於程序,本質上可以認為是執行緒切換的同時也會切換位址空間。這裡我們混用這兩個概念。

所以,程序也有關中斷的概念,關程序的中斷,會導致本程序執行的過程中,CPU不再接受中斷,但如果這個程序切換到另乙個程序上,那就按新程序的上下文來說了。

在大部分的通用CPU上(請注意,這裡說的是CPU這個視角),中斷是可巢狀的,就算你在處理中斷,只要CPU中斷線上又來訊號的,它就有可能再次進入中斷處理程式。為了避免這種情況,我們通常需要在中斷控制器上玩遊戲:當中斷控制器給乙個CPU發了乙個中斷,它就不會再發下乙個中斷(這也有很多變種,我們只說一種常見的實現),要等CPU主動對中斷控制器發起EOI操作,才會允許下乙個中斷訊號去激發CPU。

Linux系統的中斷處理的命名空間中,把進入中斷處理,到發出EOI這一段,稱為硬中斷,把EOI之後,再回到原來被中斷之前的程式之前的這一段,稱為軟中斷。但這些是軟體的概念,中斷對於CPU來說,只有開始,沒有結束一說,每次中斷的發生,都只是一次強行跳轉的過程。

現在可以回到問題本身了,從裝置的角度,給CPU發中斷,CPU可能正在執行任何程序,無論是哪個程序,效果都是陷入到核心中(通常所有程序的核心是共享的),是核心的(其實是驅動的)的中斷處理程式在處理這個中斷,並在返回到使用者空間前,儲存中斷上收到的資訊,然後進入排程程式,排程當前或者下乙個程序執行。剩下的事情,就是程序和驅動之間的恩怨了。

至於多長時間報乙個中斷,這個問題完全取決於你如何分布裝置和CPU之間的壓力,如果你發下去乙個位元組,要等1分鐘IP才能處理完,讓CPU不斷給你polling裝置準備好沒有,(這種情況,)那你當然最好是為此設定乙個中斷了。如果你的IP完成這個處理的時間和記憶體操作差不多,你完全可以一直寫下去,每隔一段時間yield一下就好了。更常見的情況是,你在Device上設定了乙個queue,填滿以後就扔給Device處理,等它處理完了,CPU回去該幹嘛幹嘛,直到中斷來了,再填充下一輪。

6樓:彩鈴

不是CPU,而是OS把中斷訊號(事件)發給程序.OS具體發給哪個程序是很複雜的機制,比如硬碟的中斷會發給系統硬碟驅動,鍵盤中斷會一層層地檢查和發訊號,最後才有可能送到前台視窗的程序.當然,不同的OS的實現也是不同的.

還有關於read,write的問題...程序不能直接讀寫硬碟埠,只能通過系統呼叫把命令告訴OS,OS會記錄你的命令,然後硬碟驅動才是真正讀寫埠的.硬碟中斷來了,OS會根據記錄來確定剛才的中斷對應什麼程序什麼操作.

樓上很多答案都答了偏硬體方面的答案,我感覺題主可能需要的是關於軟體方面(OS)的答案.

CPU 週期訊號 節拍週期訊號 節拍脈衝訊號三者之間的關係是什麼?

李進偉 時鐘週期是由CPU時鐘定義的定長時刻距離,是CPU作業的最小時刻單位,也稱節拍脈衝或T週期。通常為節拍脈衝或T週期,既主頻的倒數,它是處理操作的最基本的單位。在微程式控制器中,時序訊號比較簡單,一般選用節拍電位 節拍脈衝二級體系。就是說它只需乙個節拍電位,在節拍電位又包括若干個節拍脈衝 時鐘...

蘋果手機閃電介面檢測到液體,怎麼整

破曉 前幾天莫名其妙的就出來提示了,關鍵手機根本沒接觸到水 也按照網上教程用吹風機吹了,紙巾也擦了 等我再用幾天看下,如果不行就換尾插吧 已解決,換條資料線就行 天空藍 將閃電線纜或配件連線到 iPhone XS iPhone XS Max iPhone XR 或更新機型時,如果閃電埠中有液體,iP...

發生中斷時CPU怎麼知道程式的位址?

愛學習的好孩子 8086系統中,發生中斷時首先拿到中斷向量號n,再由此向量號找到中斷向量表相應位置,表裡面放著中斷向量程式所在位置的cs ip,cs左移四位加上ip找到中斷向量程式的實體地址,並且把中斷位置的flags cs ip入棧。 今井勝俊 兩種方法,一是硬體向量法。前提是中斷判優採用硬體排隊...