W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
一個(gè)第一次涉及內(nèi)核問(wèn)題的 Unix 程序員, 可能會(huì)緊張寫(xiě)一個(gè)模塊. 編寫(xiě)一個(gè)用戶(hù)程序來(lái)直接讀寫(xiě)設(shè)備端口可能容易些.
確實(shí), 有幾個(gè)論據(jù)傾向于用戶(hù)空間編程, 有時(shí)編寫(xiě)一個(gè)所謂的用戶(hù)空間設(shè)備驅(qū)動(dòng)對(duì)比鉆研內(nèi)核是一個(gè)明智的選擇. 在本節(jié), 我們討論幾個(gè)理由, 為什么你可能在用戶(hù)空間編寫(xiě)驅(qū)動(dòng). 本書(shū)是關(guān)于內(nèi)核空間驅(qū)動(dòng)的, 但是, 所以我們不超越這個(gè)介紹性的討論.
用戶(hù)空間驅(qū)動(dòng)的好處在于:
完整的 C 庫(kù)可以連接. 驅(qū)動(dòng)可以進(jìn)行許多奇怪的任務(wù), 不用依靠外面的程序(實(shí)現(xiàn)使用策略的工具程序, 常常隨著驅(qū)動(dòng)自身發(fā)布).
程序員可以在驅(qū)動(dòng)代碼上運(yùn)行常用的調(diào)試器, 而不必走調(diào)試一個(gè)運(yùn)行中的內(nèi)核的彎路.
如果一個(gè)用戶(hù)空間驅(qū)動(dòng)掛起了, 你可簡(jiǎn)單地殺掉它. 驅(qū)動(dòng)的問(wèn)題不可能掛起整個(gè)系統(tǒng), 除非被控制的硬件真的瘋掉了.
用戶(hù)內(nèi)存是可交換的, 不象內(nèi)核內(nèi)存. 一個(gè)不常使用的卻有很大一個(gè)驅(qū)動(dòng)的設(shè)備不會(huì)占據(jù)別的程序可以用到的 RAM, 除了在它實(shí)際在用時(shí).
一個(gè)精心設(shè)計(jì)的驅(qū)動(dòng)程序仍然可以, 如同內(nèi)核空間驅(qū)動(dòng), 允許對(duì)設(shè)備的并行存取.
如果你必須編寫(xiě)一個(gè)封閉源碼的驅(qū)動(dòng), 用戶(hù)空間的選項(xiàng)使你容易避免不明朗的許可的情況和改變的內(nèi)核接口帶來(lái)的問(wèn)題.
例如, USB 驅(qū)動(dòng)能夠在用戶(hù)空間編寫(xiě); 看(仍然年幼) libusb 項(xiàng)目, 在 libusb.sourceforge.net 和 "gadgetfs" 在內(nèi)核源碼里. 另一個(gè)例子是 X 服務(wù)器: 它確切地知道它能處理哪些硬件, 哪些不能, 并且它提供圖形資源給所有的 X 客戶(hù). 注意, 然而, 有一個(gè)緩慢但是固定的漂移向著基于 frame-buffer 的圖形環(huán)境, X 服務(wù)器只是作為一個(gè)服務(wù)器, 基于一個(gè)內(nèi)核空間的真實(shí)的設(shè)備驅(qū)動(dòng), 這個(gè)驅(qū)動(dòng)負(fù)責(zé)真正的圖形操作.
常常, 用戶(hù)空間驅(qū)動(dòng)的編寫(xiě)者完成一個(gè)服務(wù)器進(jìn)程, 從內(nèi)核接管作為單個(gè)代理的負(fù)責(zé)硬件控制的任務(wù). 客戶(hù)應(yīng)用程序就可以連接到服務(wù)器來(lái)進(jìn)行實(shí)際的操作; 因此, 一個(gè)聰明的驅(qū)動(dòng)經(jīng)??梢栽试S對(duì)設(shè)備的并行存取. 這就是 X 服務(wù)器如何工作的.
但是用戶(hù)空間的設(shè)備驅(qū)動(dòng)的方法有幾個(gè)缺點(diǎn). 最重要的是:
中斷在用戶(hù)空間無(wú)法用. 在某些平臺(tái)上有對(duì)這個(gè)限制的解決方法, 例如在 IA32 體系上的 vm86 系統(tǒng)調(diào)用.
只可能通過(guò)內(nèi)存映射 /dev/mem 來(lái)使用 DMA, 而且只有特權(quán)用戶(hù)可以這樣做.
存取 I/O 端口只能在調(diào)用 ioperm 或者 iopl 之后. 此外, 不是所有的平臺(tái)支持這些系統(tǒng)調(diào)用, 而存取/dev/port可能太慢而無(wú)效率. 這些系統(tǒng)調(diào)用和設(shè)備文件都要求特權(quán)用戶(hù).
響應(yīng)時(shí)間慢, 因?yàn)樾枰舷挛那袚Q在客戶(hù)和硬件之間傳遞信息或動(dòng)作.
更不好的是, 如果驅(qū)動(dòng)已被交換到硬盤(pán), 響應(yīng)時(shí)間會(huì)長(zhǎng)到不可接受. 使用 mlock 系統(tǒng)調(diào)用可能會(huì)有幫助, 但是常常的你將需要鎖住許多內(nèi)存頁(yè), 因?yàn)橐粋€(gè)用戶(hù)空間程序依賴(lài)大量的庫(kù)代碼. mlock, 也, 限制在授權(quán)用戶(hù)上.
最重要的設(shè)備不能在用戶(hù)空間處理, 包括但不限于, 網(wǎng)絡(luò)接口和塊設(shè)備.
如你所見(jiàn), 用戶(hù)空間驅(qū)動(dòng)不能做的事情畢竟太多. 感興趣的應(yīng)用程序還是存在: 例如, 對(duì) SCSI 掃描器設(shè)備的支持( 由 SANE 包實(shí)現(xiàn) )和 CD 刻錄器 ( 由 cdrecord 和別的工具實(shí)現(xiàn) ). 在兩種情況下, 用戶(hù)級(jí)別的設(shè)備情況依賴(lài) "SCSI gneric" 內(nèi)核驅(qū)動(dòng), 它輸出了低層的 SCSI 功能給用戶(hù)程序, 因此它們可以驅(qū)動(dòng)它們自己的硬件.
一種在用戶(hù)空間工作的情況可能是有意義的, 當(dāng)你開(kāi)始處理新的沒(méi)有用過(guò)的硬件時(shí). 這樣你可以學(xué)習(xí)去管理你的硬件, 不必?fù)?dān)心掛起整個(gè)系統(tǒng). 一旦你完成了, 在一個(gè)內(nèi)核模塊中封裝軟件就會(huì)是一個(gè)簡(jiǎn)單操作了.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: