基本介紹
- 中文名:UIO
- 含義:運行在用戶空間的I/O技術
- 可使用語言:C++,Java等
- 關鍵操作:回響硬體中斷等
定義,工作原理,核心空間,關鍵操作,
定義
為什麼我們要把I/O放在用戶空間呢?原因有二:
第一,硬體設備可以根據功能分為網路設備,塊設備,字元設備,或者根據與CPU相連的方式分為PCI設備,USB設備等。它們被不同的核心子系統支持。這些標準的設備的驅動編寫較為容易而且容易維護。很容易加入主核心源碼樹。但是,又有很多設備難以劃分到這些子系統中,比如I/O卡,現場匯流排接口或者定製的FPGA。通常這些非標準設備的驅動被實現為字元驅動。這些驅動使用了很多核心內部函式和宏。而這些內部函式和宏是變化的。這樣驅動的編寫者必須編寫一個完全的核心驅動,而且一直維護這些代碼。像這種設備如果把驅動放入Linux核心,不但增大了核心的負擔而且還很少使用,更沒有人願意免費的花費大量精力去維護這樣的驅動,使用UIO使驅動的開發可以利用所有的用戶空間的應用程式開發工具和庫,而且當系統核心發生變化時,只要更改UIO框架與其他核心程式互動的接口即可,不需要更改UIO框架下面的driver。
第二,核心驅動的開發必須使用C語言加上少量彙編代碼。uio可以使用C++,Java ...等高級語言極大的方便了開發。我們可以發現,有很多的卡的驅動在核心空間已經有實現,這樣,我們可以參考已經存在的代碼,極大的提高的開發的速度,和降低了開發成本。而且核心驅動的調試會比用戶空間程式調試複雜很多。我們經常遇到當機,涉及到多個子系統,棘手。放在用戶空間的話如果驅動程式死了,並不影響系統的正常運行並且方便了我們的開發。
工作原理
通過UIO的運行原理圖可以看出,用戶空間下的驅動程式比運行在核心空間的驅動要多得多,UIO框架下運行在核心空間的驅動程式所做的工作很簡單,常做的只有兩個:分配和記錄設備需要的資源和註冊uio設備和必須在核心空間實現的小部分中斷應答函式,經過實踐表明後面的工作也是可以省略的!我們認為uio核心空間的程式所做的越少越好,在用戶空間能完成的我們就不需要放在核心空間做(比如說回響中斷),這樣假如核心有變化,uio框架中的驅動維護也是比較簡單的!對於用戶空間的驅動程式,我們還可以集成到某款套用軟體中,這樣也是可行的,上面已經說過了,因為使用uio的設備一般比較少見,所以可以作出這類的驅動也可以針對某款或者一類設備作出應用程式集成了驅動即可!
核心空間
UIO的少量運行在核心空間的驅動所做的工作有哪些呢?
(1)分配和記錄設備需要的資源和註冊uio設備
在設備的探測函式中:
- 使能PCI 設備
- 申請資源
- 讀取並記錄配置信息
- 註冊uio設備// uio_register_device()
// uio_8139d_pci_probe & uio_8139d_handler
(2)必須*在核心空間實現的小部分中斷應答函式
關鍵操作
2.回響硬體中斷
int32_t irq_count;
int fd = open("/dev/uio0", O_RDWR);
/* Map the register regions to proccess's virtual memspace */
void * access = mmap(NULL, 4096,
// 暫存器的讀寫操作,可用過普通記憶體讀寫的方式完成
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);// [1]
while (read(fd, &irq_count, 4) == 4) {[2]
printf("Interrupt number %d\n", irq_count);
}