linux中斷處理_學習筆記

来源:http://www.cnblogs.com/gexin/archive/2017/08/03/7281624.html
-Advertisement-
Play Games

中斷與中斷處理 何為中斷? + 一種由設備發向處理器的電信號 + 中斷不與處理器時鐘同步,隨時可以發生,內核隨時可能因為中斷到來而被打斷。 + 每一個中斷都有唯一一個數字標誌,稱之為中斷線(IRQ) + 異常是由軟體產生,與處理器時鐘同步。 中斷處理程式 + 由內核調用來響應中斷 + 運行於中斷上下 ...


中斷與中斷處理

何為中斷?

  • 一種由設備發向處理器的電信號
  • 中斷不與處理器時鐘同步,隨時可以發生,內核隨時可能因為中斷到來而被打斷。
  • 每一個中斷都有唯一一個數字標誌,稱之為中斷線(IRQ)
  • 異常是由軟體產生,與處理器時鐘同步。

中斷處理程式

  • 由內核調用來響應中斷
  • 運行於中斷上下文
  • 中斷的執行不可阻塞
  • 中斷處理分為兩個部分,中斷處理程式是上半部(top half),還有下半部(bottom halves)

中斷處理程式註冊

  • 中斷處理程式是管理硬體驅動程式的組成部分,如果設備使用中斷,其相應的驅動程式就會註冊一個中斷處理程式。
  • 通過request_irq()函數來註冊中斷處理程式

    int request_irq( unsigned irq,
        irq_handler_t handler,
        unsigned long flags,
        count char* name,
        void *dev)
  • 第一個參數irq表示要分配的中斷號
  • 第二個參數handler表示中斷處理程式指針
  • 第三個表示標誌,可以為0、IRQF_DISABLE、IRQF_SAMPLE_RANDOM、IRQF_TIMER、IRQF_SHARED
    • IRQF_DISABLE 表示該中斷處理期間,禁用所有其他中斷
    • IRQF_SAMPLE_RANDOM 這個設備產生的中斷對內核熵池有貢獻
    • IRQF_TIMER 為系統定時器中斷而準備的
    • IRQF_SHARED 表示多個中斷處理程式共用中斷線。
  • 第四個參數name表示設備的文本表示
  • 第五個參數dev用於共用中斷線,dev提供唯一的標誌信息。

需要註意的是,request_irq( )可能睡眠,因此不能再中斷上下文或者其他不允許阻塞的代碼中調用該函數。

中斷處理程式釋放

卸載驅動程式時,需要用free_irq()註銷相應的中斷處理程式,並釋放中斷線。

  void free_irq(unsigned int irq, void *dev);

如果指定的中斷線不是共用的,那麼該函數刪除處理程式的同時將禁用這條中斷線。如果是共用的,只刪除dev對應的中斷處理程式。

編寫中斷處理程式

static irqreturn_t intr_handler(int irq, void * dev);

當一個給定的中斷處理程式正在執行時,相應的中斷線在所有的處理器上都會被屏蔽掉,以防止在同一條中斷線上接受另一個新的中斷。

中斷上下文

  • 當執行一個中斷時,內核處於中斷上下文。
  • 中斷上下文沒有後備進程,不可以睡眠。
  • 中斷上下文有著嚴格的時間限制,因為其打斷了其他代碼(有可能打斷了其他中斷處理程式)。中斷上下文中的 代碼應該迅速簡潔,儘量不要使用迴圈去處理繁重的工作。

中斷控制

Linux內核提供了一組介面用於控制機器上的中斷狀態

  • 禁止和激活中斷
    用於禁止、激活當前處理器的本地中斷,

    local_irq_disable();
    local_irqenable();
  • 禁止指定中斷線

    void disable_irq(unsigned int irq);         //禁止控制器上某一條中斷線,函數只有在當前執行的所有處理程式完成後,才能返回 
    void disable_irq_nosync(unsigned int irq);  //禁止控制器上某一條中斷線,不會等待當前中斷處理程式執行完畢。
    void enable_irq(unsigned int irq);          //激活控制器上某一條中斷線, 
    void synchronize_irq(unsigned int irq);     //等待下一個特定的中斷處理程式退出

    在一條中斷線上,每次調用disable_irq_nosync()、disable_irq(),都需要調用一次enable_irq(),只有在enable_irq()完成了最後一次調用後,才完成了中斷線的激活。

  • 這三個函數可以從中斷或進程上下文中調用,而且不會睡眠。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 停止kafka服務: kafka_2.12-0.10.2.1> bin/kafka-server-stop.sh kafka_2.12-0.10.2.1> bin/zookeeper-server-stop.sh Step 1: 下載Kafka 下載最新的版本並解壓. > tar -xzf kafk ...
  • MySQL導入-導出資料庫-mac版 導出資料庫-表結構,和數據 mysqldump -u 賬號 -p 資料庫名 表 > 文件名.sql 例如:mysqldump -u root -p testdatabase tablename > test.sql 輸入密碼即可 導出表結構 mysqldump ...
  • Apache Spark 記憶體管理詳解 Spark 作為一個基於記憶體的分散式計算引擎,其記憶體管理模塊在整個系統中扮演著非常重要的角色。理解 Spark 記憶體管理的基本原理,有助於更好地開發 Spark 應用程式和進行性能調優。本文旨在梳理出 Spark 記憶體管理的脈絡,拋磚引玉,引出讀者對這個話題的 ...
  • 1> 啟動資料庫 1.1> 依次添加如下目錄: 1.1.1> mongodb-space 1.1.2> mongodb-space/conf 1.1.3> mongodb-space/data 1.1.4> mongodb-space/log 1.2> 在 mongodb-space/conf 目錄 ...
  • 目錄 · 概述 · 手工搭建集群 · 引言 · 安裝Python · 配置文件 · 啟動與測試 · 應用部署 · 參數配置 · Storm命令 · 原理 · Storm架構 · Storm組件 · Stream Grouping · 守護進程容錯性(Daemon Fault Tolerance) · ...
  • LNMP編譯安裝之msyql安裝--圖文詳解 1、前言 本次安裝採用源碼安裝,主要資源包從官網下載,次要依賴則使用yum進行安裝,本篇只涉及mysql的安裝,msyql遠程登錄,不涉及mysql具體配置。該教程純屬安裝,不涉及任何重要知識點,老少皆宜。 2、安裝步驟 2.1、下載boost(只下載不 ...
  • 一.SSH免密登陸配置 1、相關概念 SSH 為 Secure Shell(安全外殼協議) 的縮寫。 很多ftp、pop和telnet在本質上都是不安全的,因為它們在網路上用明文傳送口令和數據,別有用心的人非常容易就可以截獲這些口令和數據。而SSH就是專為遠程登錄會話和其他網路服務提供安全性的協議。 ...
  • 實驗內容: (1)主機IP (2)要求 一 伺服器端配置 1安裝nfs utils 軟體包 2編輯配置文件 共用目錄為/data/web 3創建共用目錄 4開啟服務 二 客戶端配置 1 掛載 (1)新建掛載的目錄 (2)掛載伺服器共用的目錄(/data/web/)至本地/var/www/html 2 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...