歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核工程導論——UIO

Linux內核工程導論——UIO

日期:2017/3/1 12:17:42   编辑:Linux內核

要開啟hugepages文件系統,這個文件系統要使用mmap來映射頁,可以顯著的減少缺頁中斷。

UIO介紹

UIO是一個在用戶端實現內核驅動的機制。其在內核中有一個模塊支持uio模塊。現在這個模塊只支持字符設備。用戶可以添加多個uio設備(用戶端的設備驅動),每個設備在/dev/uioX,X為數字,第一個為0,依次類推。我們知道設備都是靠中斷來響應的,響應uio設備中斷的方法是讀取/dev/uioX文件,沒有中斷的時候讀取會阻塞,來中斷的時候會讀取到整數值,代表已經發生的中斷的次數。

但是這只是一般情況,有的設備有多個中斷,有的沒有中斷。針對這些情況uio也實現了對應的機制,但是實現稱不上完美。對於多個中斷的情況,對/dev/uioX進行write()系統調用可以打開或者關閉內核的中斷處理,以便驅動可以手動處理中斷。沒有中斷的情況,uio提供了一個定時器接口,通過設置這個接口可以人工的讓這個設備定時產生中斷。

對於UIO用戶定義的驅動,類似內核驅動,一般會有一些需要通過sys文件系統訪問的全局變量。uio不支持調用sysctl更改這些值,但是可以在sys文件系統找到這些對應的文件,從而進行修改:/sys/class/uio/uioX

每個uio設備都有name、version、event這3個定義屬性,還有一個maps文件夾(有內存映射的時候才存在),其他為sys文件系統自帶的uevent模型。name表示這個UIO設備的名字,version用於標示當前的uio內核模塊的版本,event與read() 設備獲得的值一樣,是當前已經發生過了中斷的次數。maps文件夾服務於硬件的數據處理。大部分硬件都需要操作內存,UIO用戶驅動如果要映射設備內存到用戶端操作,需要使用mmap系統調用,每使用一次系統調用會在maps目錄下生成一個目錄map[digital],裡面有4個固定的文件用來描述映射的內存的信息:

其中addr是映射的基地址,offset是偏移量,name是映射時給這段映射起的名字,size是映射的內存的大小。如果不能映射內存的話,還可以通過x86的端口操作系統調用ioperm(), iopl(), inb(), outb()等對某個硬件端口進行讀寫。這種情況下,uio模塊還添加了/sys/class/uio/uioX/portio/目錄,下面是各個模塊的文件映射,使得用戶仍然可以直接操作端口來改變配置。

由於UIO在用戶空間寫驅動的便利性,所以對FPGA提供了很好的支持,甚至dpdk這種將內核數據包導出到用戶空間的機制也是使用UIO的。Open Source Automation Development Lab等使用機器人編程的組織也喜歡UIO。

IOMMU

IOMMU本來是為虛擬化而設計,使用場景是如果驅動在用戶態(比如虛擬機),沒有高效的使用設備IO內存的方法,內核要在用戶內存空間到設備內存空間做額外的轉換,IOMMU可以直接將設備的內存空間映射到用戶進程空間。用戶可以直接排它的操作硬件。

VFIO

則是軟件對硬件設備內存暴漏在用戶空間的支持,DMA內存直接被映射到用戶進程空間,使用這個驅動需要將設備與操作系統原來的驅動解綁。目前僅實現了支持vfio-pci模塊支持PCI設備的映射。這對於在虛擬機和用戶空間設備驅動有重要意義。

Copyright © Linux教程網 All Rights Reserved