在嵌入式Linux系統(tǒng)開發(fā)過(guò)程中,設(shè)備驅(qū)動(dòng)程序的編寫涉及到內(nèi)核空間的眾多接口函數(shù)、權(quán)限分配、線程控制等,是一個(gè)難以理解掌握的重要內(nèi)容[1]。對(duì)于Linux內(nèi)核編程不熟悉的驅(qū)動(dòng)程序?qū)W習(xí)者來(lái)說(shuō),是一道難以逾越的障礙,從而影響了對(duì)嵌入式Linux驅(qū)動(dòng)開發(fā)的學(xué)習(xí)。
通過(guò)研究Linux內(nèi)核源代碼[2-3],設(shè)備文件/dev/mem是ARM嵌入式處理器主存的一個(gè)映像。通過(guò)內(nèi)存映像的方式,把整個(gè)/dev/ mem設(shè)備文件或文件的一部分映射到內(nèi)存中,并在內(nèi)存中創(chuàng)建一個(gè)與Linux內(nèi)核存儲(chǔ)器完全相同的映像,實(shí)現(xiàn)嵌入式處理器的物理地址映射到內(nèi)存中,可以提供給用戶程序直接訪問(wèn)設(shè)備內(nèi)存的能力。映射一個(gè)設(shè)備意味著將用戶空間的一段內(nèi)存與設(shè)備內(nèi)存關(guān)聯(lián)起來(lái),當(dāng)程序在分配的地址范圍內(nèi)作讀寫操作時(shí),實(shí)際訪問(wèn)的是設(shè)備地址。
3結(jié)論
用戶空間驅(qū)動(dòng)實(shí)現(xiàn)由物理內(nèi)存到用戶空間的映射,直接對(duì)設(shè)備端口進(jìn)行讀寫操作,不必關(guān)心內(nèi)核的細(xì)節(jié)問(wèn)題,大大降低了編寫驅(qū)動(dòng)程序的難度。通過(guò)把用戶空間的驅(qū)動(dòng)程序加上文件系統(tǒng)接口,使用內(nèi)核同步機(jī)制進(jìn)行同步,從而把用戶空間驅(qū)動(dòng)編譯進(jìn)內(nèi)核,轉(zhuǎn)變?yōu)閮?nèi)核驅(qū)動(dòng)。
但用戶空間的驅(qū)動(dòng)程序?qū)崿F(xiàn)也有缺點(diǎn),如響應(yīng)速度慢,不能處理網(wǎng)絡(luò)設(shè)備和塊設(shè)備等。驅(qū)動(dòng)程序的開發(fā)者要根據(jù)具體的應(yīng)用場(chǎng)合進(jìn)行相應(yīng)選擇。
參考文獻(xiàn):
[1] Corbet J.Linux設(shè)備驅(qū)動(dòng)程序[M].