2、中斷處理程式
3、上半部和下半部的對比
處理器的速度和外圍裝置的速度相差太遠,為了解決讓核心不做過多的無用功(使用輪詢),這是就需要一種機制在硬體需要時再向核心發出訊號(中斷機制)
中斷機制可以更好的協同處理器和外部裝置,並且提高機器的效能
中斷:指的是可以使得硬體得以發出通知給處理器,中斷可以隨時產生(硬體裝置再產生中斷的時候並不會去考慮和處理器的時鐘同步)。
如:敲擊鍵盤時,鍵盤控制器會傳送乙個中斷,通知作業系統有鍵按下
中斷本質:一種特殊的電訊號,由硬體裝置發向處理器,處理器收到後會將訊號反應到作業系統,然後由作業系統處理新到來的資料(中斷資訊)
中斷流程:硬體裝置----->中斷控制器------>處理器------>作業系統
硬體裝置:負責產生,每個中斷都通過乙個唯一的數字標誌
中斷控制器用於收集硬體裝置的中斷訊號(採用的多入口單出口的設計),收到後會傳送訊號到cpu,乙個出口連線cpu,
處理器:當收到訊號後會中斷當前工作,去處理中斷
作業系統:cpu會通知作業系統,然後作業系統會對作業系統進行適當的處理
異常中斷和異常不同,異常在產生時必須考慮與處理器時鐘同步。異常通常稱為同步中斷
異常的產生:程式設計失誤錯誤指令(段錯誤等)或者執行時缺頁等特殊情況,必須靠核心處理,cpu就會產生乙個異常
cpu的處理異常和中斷的方式類似,因此核心對他們的處理也類似
中斷處理程式:在響應乙個特定中斷的時候,核心會執行的函式
產生中斷的每個裝置都有乙個相應的中斷處理程式,中斷處理程式不是和特定的裝置關聯而是和特定中斷關聯,即乙個裝置可以產生多種不同中斷
中斷處理程式和其他核心函式的區別:中斷處理程式是被核心呼叫來響應中斷的,執行於我們稱之為中斷上下文(原子上下文,上下文中的執行**不可阻塞)
每一裝置都有相關的驅動程式,如果使用中斷,相應的驅動程式就註冊乙個中斷處理程式,通過request_irq()函式註冊中斷處理程式,並啟用給定的中斷線
request_irq(unsigned int irq, irq_handler_t handler, unsigned ling flags, const char *name, void *dev)
為什麼有上下兩部分:因為我們既想中斷處理程式執行得快,又想中斷處理程式完成的工作量多,二者是矛與盾的關係,因此將中斷處理程式切分為兩個部分
上半部分:接收到乙個中斷,立即開始執行,但只做有嚴格時限的工作
如:對接收的中斷進行應答或復位硬體,這些工作都是在所有中斷被禁止的情況下完成的
下半部分:能夠被允許稍後完成的工作會推遲到下半部去做。
上下不放呢分割的例子:
網絡卡:網絡卡接收資料----->通知核心資料報到了,網絡卡需要立即處理以避免超時
網絡卡發出中斷---->核心----->執行網絡卡註冊的中斷處理程式作出響應----->中斷開始執行---->通知硬體拷貝資料到記憶體
為什麼需要實時拷貝到記憶體:
防止阻塞,因為網絡卡的快取固定相對於記憶體國小,拷貝到記憶體時中斷的任務就完成了即上半部分的工作完成;
資料報的處理就是下半部分要做的事情。
Linux中斷和中斷處理
眾所周知,處理器的速度跟外圍的硬體裝置的速度往往不在乙個數量級上,因此,如果核心採取讓處理器傳送乙個請求,然後專門等待回應的辦法,顯然差強人意。既然硬體處理的這麼慢,那麼核心就應該在這期間去處理其他事務,等待硬體真正完成了請求的操作後,再回過頭來對它進行處理。輪詢 polling 可能會是一種解決辦...
Linux核心實現中斷和中斷處理(一)
核心是怎麼知道應用程式要呼叫系統呼叫的呢?或者說應用程式怎麼通知系統核心自己需要執行乙個系統呼叫,這是通過軟中斷實現的,通過引發乙個異常來促使系統切換到核心態去執行異常處理程式 ps 什麼時候會從使用者態切換到核心態呢?1.中斷 2.陷阱 3.系統呼叫 中斷分為兩種,硬中斷和軟中斷 在許多處理器體系...
Linux中斷處理
裝置管理過程中,中斷號的申請是乙個非常重要的操作。當裝置發出中斷之後,硬體裝置根據intel cpu的通用處理過程,跳轉到了該中斷號對應的中斷相應函式處。在linux作業系統中,必定要跳到do irq函式處。在do irq 函式中,進行了一部分公共的中斷響應處理之後,根據已經入棧了的中斷號查詢裝置中...