深入淺出分析Linux裝置驅動程式中斷 (1)(3)
六、中斷處理程序的不可重入性
上一節我們提到有時候需要屏蔽中斷,可是為什麼要將這個中斷屏蔽掉呢?這並不是因為技術上實作不了同一中斷例程的並行,而是出於管理上的考量。之所以在中斷處理的過程中要屏蔽同一IRQ來的新中斷,是因為中斷處理程序是不可重入的,所以不能並行執行同一個中斷處理程序。這裡我們舉一個例子,從這裡子例可以看出如果一個中斷處理程序是可以並行的話,那麼很有可能會發生驅動程式鎖死的情況。當驅動程式鎖死的時候,你的作業系統不一定會崩潰,但是鎖死的驅動程式所支援的那個裝置是不能再使用了--裝置驅動程式死了,裝置也就死了。
其中激發PS1的事件會使A1產生一個中斷,然後B1去讀R1中已有的數據,然後代碼C1向R2中寫數據。而激發PS2的事件會使A2產生一個中斷,然後B2刪除R1中的數據,然後C2讀去R2中的數據。
如果PS1先產生,且當他執行到A1和B1之間的時候,如果PS2產生了,這是A2會產生一個中斷,將PS2中斷掉(掛到任務隊列的尾部),然後刪除了R1的內容。當PS2運行到C2時,由於C1還沒有向R2中寫數據,所以C2將會在這裡被掛起,PS2就睡眠在代碼C2上,直到有數據可讀的時候被信號喚醒。這是由於PS1中的B2原先要讀的R1中的資料被PS2中的B2刪除了,所以PS1頁會睡在B1上,直到有資料可讀的時候被訊號喚醒。這樣一來,喚醒PS1和PS2的事件就永遠不會發生了,因此PS1和PS2之間就鎖死了。
由於裝置驅動程式要和裝置的暫存器打交道,所以很難寫出可以重入的程式碼來,因為裝置暫存器就是全域變數。因此,最簡潔的辦法就是禁止相同裝置的中斷處理程序並行,也就是裝置的中斷處理程序是不可重入的。
有一點一定要清楚:在2.0版本以後的Linux kernel中,所有的上半部都是不可中斷的(上半部的操作是原子性的);不同設備的下半部可以互相中斷,但一個特定的下半部不能被它自己所中斷(即同一個下半部不能並行)。
由於中斷處理程序要求不可重入,所以程式設計師也不必為編寫可重入的程式碼而頭痛了。以我的經驗,編寫可重入的裝置驅動程式是可以的,編寫可重入的中斷處理程序是非常難得,幾乎不可能。
七、避免競爭條件的出現
我們都知道,一旦競爭條件出現了,就有可能會發生死鎖的情況,嚴重時可能會將整個系統鎖死。所以一定要避免競爭條件的出現。這裡我不多說,大家只要注意一點:絕大多數因為中斷產生的競爭條件,都是在有中斷的核心行程被睡眠造成的。所以在實作中斷的時候,一定要相信謹慎的讓行程睡眠,必要的時候可以使用cli、sti或save_flag、restore_flag。具體細節請參考本文指定參考書。
八、實作
如何實現驅動程式的中斷例程,是各位讀者的事情了。只要你們仔細的閱讀short例程的源代碼,搞清楚編寫驅動程式中斷例程的規則,就可以編寫自己的中斷例程了。只要概念正確,在正確的規則下寫你的程式碼,那就是符合道理的東西。我始終強調,概念是第一位的,能編多少程式碼是很其次的,我們一定要概念正確,才能進行正確的思考。
(T114)
以上就是深入淺出分析Linux裝置驅動程式中斷 (1)(3)的內容,更多相關內容請關注PHP中文網(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Linux適用於服務器、開發環境和嵌入式系統。 1.作為服務器操作系統,Linux穩定高效,常用於部署高並發應用。 2.作為開發環境,Linux提供高效的命令行工具和包管理系統,提升開發效率。 3.在嵌入式系統中,Linux輕量且可定制,適合資源有限的環境。

在Linux上使用Docker可以提高開發和部署效率。 1.安裝Docker:使用腳本在Ubuntu上安裝Docker。 2.驗證安裝:運行sudodockerrunhello-world。 3.基本用法:創建Nginx容器dockerrun--namemy-nginx-p8080:80-dnginx。 4.高級用法:創建自定義鏡像,使用Dockerfile構建並運行。 5.優化與最佳實踐:使用多階段構建和DockerCompose,遵循編寫Dockerfile的最佳實踐。

當 Apache 80 端口被佔用時,解決方法如下:找出佔用該端口的進程並關閉它。檢查防火牆設置以確保 Apache 未被阻止。如果以上方法無效,請重新配置 Apache 使用不同的端口。重啟 Apache 服務。

啟動 Apache 的步驟如下:安裝 Apache(命令:sudo apt-get install apache2 或從官網下載)啟動 Apache(Linux:sudo systemctl start apache2;Windows:右鍵“Apache2.4”服務並選擇“啟動”)檢查是否已啟動(Linux:sudo systemctl status apache2;Windows:查看服務管理器中“Apache2.4”服務的狀態)啟用開機自動啟動(可選,Linux:sudo systemctl

啟動 Oracle 監聽器的步驟如下:檢查監聽器狀態(使用 lsnrctl status 命令)對於 Windows,在 Oracle Services Manager 中啟動 "TNS Listener" 服務對於 Linux 和 Unix,使用 lsnrctl start 命令啟動監聽器運行 lsnrctl status 命令驗證監聽器是否已啟動

本文介紹如何在Debian系統上有效監控Nginx服務器的SSL性能。我們將使用NginxExporter將Nginx狀態數據導出到Prometheus,再通過Grafana進行可視化展示。第一步:配置Nginx首先,我們需要在Nginx配置文件中啟用stub_status模塊來獲取Nginx的狀態信息。在你的Nginx配置文件(通常位於/etc/nginx/nginx.conf或其包含文件中)中添加以下代碼段:location/nginx_status{stub_status

本文介紹兩種在Debian系統中配置回收站的方法:圖形界面和命令行。方法一:使用Nautilus圖形界面打開文件管理器:在桌面或應用程序菜單中找到並啟動Nautilus文件管理器(通常名為“文件”)。找到回收站:在左側導航欄中尋找“回收站”文件夾。如果找不到,請嘗試點擊“其他位置”或“計算機”進行搜索。配置回收站屬性:右鍵點擊“回收站”,選擇“屬性”。在屬性窗口中,您可以調整以下設置:最大大小:限制回收站可用的磁盤空間。保留時間:設置文件在回收站中自動刪除前的保

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信
