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系統中的Device Mapper機制:使用者空間LinuxdevAPP
- 計算機I/O與I/O模型計算機模型
- Linux I/O排程器Linux
- Linux下的5種I/O模型與3組I/O複用Linux模型
- Linux裡五種I/O模型Linux模型
- Linux下磁碟I/O測試Linux
- Linux使用者空間記憶體管理Linux記憶體
- 如何更改Linux的I/O排程器Linux
- 如何監測 Linux 的磁碟 I/O 效能Linux
- Linux程式上下文和中斷上下文核心空間和使用者空間Linux
- I/O流
- Java I/OJava
- Linux之《荒島餘生》(四)I/O篇Linux
- Linux命令----分析系統I/O的瓶頸Linux
- LINUX 建立swap空間Linux
- linux 修改swap空間Linux
- [Linux]程序地址空間Linux
- 計算機組成原理——I/O通道計算機
- 時間複雜度O(n)和空間複雜度時間複雜度
- Linux 程式間通訊的六種機制Linux
- Python教程:精簡概述I/O模型與I/O操作Python模型
- linux限定使用者或組對磁碟空間的使用Linux
- 關於I/O
- c++ I/OC++
- 【java】I/O流Java
- Java(8)I/OJava
- Netty權威指南:Linux網路 I/O 模型簡介NettyLinux模型
- 當使用者無限制使用表空間配額且表空間有足夠空間時出現超出表空間的空間限額
- JAVA I/O系統Java
- 系統級 I/O
- Google I/O Extend 2018Go
- 網路I/O模型模型
- NodeJs 非同步 I/ONodeJS非同步
- 理解I/O Completion Port
- python 非同步 I/OPython非同步
- 02. I/O 操作
- Java 非同步 I/OJava非同步
- Hadoop的I/O操作Hadoop