Linux UIO機制--使用者空間I / O操作方法

香雨亭榭發表於2020-10-30

目錄

         前言

關於UIO

UIO 的工作原理:


前言

於許多型別的裝置,建立Linux核心驅動程式是過分的。真正需要的只是某種方式來處理中斷並提供對裝置儲存空間的訪問。控制裝置的邏輯不必一定要在核心之內,因為裝置不需要利用核心提供的任何其他資源。這樣的一種常見的裝置類別是用於工業I / O卡的裝置。

為了解決這種情況,設計了使用者空間I / O系統(UIO)。對於典型的工業I / O卡,只需要一個非常小的核心模組。驅動程式的主要部分將在使用者空間中執行。這簡化了開發並降低了核心模組中嚴重錯誤的風險。

請注意,UIO不是通用驅動程式介面。已經被其他核心子系統(例如網路,序列或USB)良好處理的裝置不適合使用UIO驅動程式。最適合UIO驅動程式的硬體滿足以下所有條件:

  • 裝置具有可以對映的記憶體。通過寫入該儲存器可以完全控制該裝置。
  • 裝置通常會產生中斷。
  • 該裝置不適合標準核心子系統之一。

關於UIO

如果您將UIO用作卡的驅動程式,則將獲得以下資訊:

  • 只需編寫和維護一個小的核心模組。
  • 使用您習慣的所有工具和庫在使用者空間中開發驅動程式的主要部分。
  • 驅動程式中的錯誤不會使核心崩潰。
  • 無需重新編譯核心即可進行驅動程式更新。

UIO 的工作原理:

        UIO分成2個部分,主要是核心部分和使用者空間部分, 在核心部分主要是實現硬體暫存器的記憶體對映(struct uio_info -> struct uio_mem)及讀寫操作, 在使用者空間部分,將uio裝置的uio_mem對映到本地(mmap), 這樣就可以實現在使用者空間訪問硬體裝置暫存器的目的, 再通過裝置的控制邏輯,就可以實現硬體裝置的驅動。 

一個UIO裝置驅動的主要任務有兩個:

        1. 存取裝置的記憶體 UIO 核心實現了mmap()可以處理實體記憶體(physical memory),邏輯記憶體(logical memory),虛擬記憶體(virtual memory)UIO驅動的編寫是就不需要再考慮這些繁瑣的細節。 如果有些裝置的匯流排不是PCI匯流排, 那麼仍需要做相關的處理   
        2.
處理裝置產生的中斷 對於裝置中斷的應答必須在核心空間進行。所以在核心空間有一小部分程式碼 用來應答中斷和禁止中斷,但是其餘的工作全部留給使用者空間處理。  
        如果使用者空間要等待一個裝置中斷,它只需要簡單的阻塞在對 /dev/uioXread()操作上。當裝置產生中斷時,read()操作立即返回。UIO 也實現了poll()系統呼叫,你可以使用  select()來等待中斷的發生。select()有一個超時引數可以用來實現有限時間內等待中斷。   對裝置的控制還可以通過/sys/class/uio下的各個檔案的讀寫來完成。你註冊的uio裝置將會出現在該目錄下。假如你的uio裝置是uio0那麼對映的裝置記憶體檔案出現在 /sys/class/uio/uio0/maps/mapX,對該檔案的讀寫就是對裝置記憶體的讀寫。

 

如果覺得寫得不錯,煩請微信搜尋公眾號 "鄭州行疆戶外" 瞭解程式設計師的戶外業餘喜好。

相關文章