萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> Linux內核驅動fsync機制實現圖解

Linux內核驅動fsync機制實現圖解

   在Linux內核中的IO模型基本分為4類:

  1、同步阻塞I/O

  2、同步非阻塞I/O

  3、異步阻塞I/O

  4、異步非阻塞I/O

  同步:應用顯式地通過函數訪問數據,在此函數返回時就會得到結果(成功或失敗)。

  異步:應用會顯示地通過函數提出訪問或關注申請。數據到達時,硬件和驅動會通知應用,此時代碼一般不在讀寫訪問函數中,而是得到通知了再去有目的的訪問數據。

  阻塞:在等待數據的過程中會休眠在此處,而非阻塞即函數不休眠立即返回,可執行接下來的代碼。

  對於這4種機制,在《深入Linux設備驅動程序內核機制》中有講解,對於異步非阻塞I/O其實內核提供了兩種實現一個是aio,另一個就是fasync。aio應該算是一個比較新的框架,較為復雜,本人沒有深入的研究過,以後研究過後在寫總結。對於fasync,《深入Linux設備驅動程序內核機制》中有詳細的講解以及實驗,在看完了這知識以後,我像往常一樣,畫了一個框圖來梳理所有的代碼關聯。這個圖在兩個月前畫好的,由於我的寶寶及工作的關系就耽擱了發布。

  (上面的圖片比較下, 建議下載到本地打開)

  要理解內核的fasync機制,可以結合這個圖和《深入Linux設備驅動程序內核機制》中的講解。我根據這個流程圖,總結下我自己的認識:

  首先,fasync機制是通過內核發送出的SIGIO信號來實現通知機制的,並不是通過休眠喚醒。

  從這個角度來說,應用就必須做以下工作:

  1、安裝SIGIO信號(信號例程處理內核數據可訪問的情況)

  2、告訴內核所需要通知的進程ID

  3、設置FASYNC標志,內核會通過驅動調用fasync方法為以後的信號通知做准備。

  在應用程序完成了相關設定後,就可以做別的事了,如果有任何問題,內核會通過SIGIO信號通知,應用安裝的信號例程就會被調用。

  而在內核空間這端,相關的驅動程序需要實現以下工作:

  1、定義一個全局的struct fasync_struct指針;

  2、實現file_operations中的fasync方法,基本就是調用內核的輔助函數fasync_helper。

  3、在驅動某個可以獲知數據可訪問信息的例程中調用kill_fasync函數。

  通過以上內核與應用的配合,就可以方便的使用內核異步通知機制。這種機制用起來簡單,觀其機制,一開始覺得挺復雜的,一旦深入將所有相關的結構體和例程整理一下就會發現,其實這個機制的實現也很清楚明了。個人一直認為對於內核的學習,首先要理清構架及數據結構間的關系。而看別人的代碼分析能讓你適當的理解下構架,最後關鍵在於自己RTFSC。所以我現在一般不再博文中分析代碼,而只說構架和圖解,代碼需要有興趣的朋友自己分析。

copyright © 萬盛學電腦網 all rights reserved