Linux UIO機制--使用者空間I / O操作方法
目錄
前言
於許多型別的裝置,建立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/uioX的read()操作上。當裝置產生中斷時,read()操作立即返回。UIO 也實現了poll()系統呼叫,你可以使用 select()來等待中斷的發生。select()有一個超時引數可以用來實現有限時間內等待中斷。 對裝置的控制還可以通過/sys/class/uio下的各個檔案的讀寫來完成。你註冊的uio裝置將會出現在該目錄下。假如你的uio裝置是uio0那麼對映的裝置記憶體檔案出現在 /sys/class/uio/uio0/maps/mapX,對該檔案的讀寫就是對裝置記憶體的讀寫。
如果覺得寫得不錯,煩請微信搜尋公眾號 "鄭州行疆戶外" 瞭解程式設計師的戶外業餘喜好。
相關文章
- 【轉載】Linux 中直接 I/O 機制的介紹Linux
- 計算機I/O與I/O模型計算機模型
- 瞭解Linux系統中的Device Mapper機制:使用者空間LinuxdevAPP
- Linux 核心空間與使用者空間Linux
- RAC中臨時空間使用機制
- linux記憶體管理--使用者空間和核心空間Linux記憶體
- Linux I/O排程器Linux
- 深入 Linux I/O 重定向Linux
- InnoDB 中文參考手冊 --- 12 檔案空間管理和磁碟 I/O (轉)
- swift-名稱空間/反射機制(Reflect)Swift反射
- 從資料庫層面理解:隨機 I/O & 順序 I/O資料庫隨機
- Linux下的5種I/O模型與3組I/O複用Linux模型
- Veritas Quick I/O and Cached Quick I/OUI
- Linux下磁碟I/O測試Linux
- Linux裡五種I/O模型Linux模型
- Linux libaio 非同步I/OLinuxAI非同步
- linux I/O 瓶頸監控Linux
- Linux使用者空間記憶體管理Linux記憶體
- I/O埠和I/O記憶體記憶體
- Linux 下的I/O效能分析 iotopLinux
- linux監測I/O效能-iostatLinuxiOS
- HOW TO CHECK IF ASYNCHRONOUS I/O IS WORKING ON LINUXLinux
- ORACLE空間管理實驗3:區管理之大區小區對I/O效能的影響Oracle
- 計算機組成原理——I/O通道計算機
- 時間複雜度O(n)和空間複雜度時間複雜度
- Linux之《荒島餘生》(四)I/O篇Linux
- 如何監測 Linux 的磁碟 I/O 效能Linux
- 如何更改Linux的I/O排程器Linux
- 【I/O scheduler】Linux的磁碟排程策略Linux
- Linux shell I/O重定向詳解(zt)Linux
- 在Linux下測試磁碟的I/OLinux
- Linux程式上下文和中斷上下文核心空間和使用者空間Linux
- 為Linux虛擬機器增加磁碟空間Linux虛擬機
- Java(8)I/OJava
- 【java】I/O流Java
- Java I/O流Java
- 檔案I/O
- C++ I/OC++