驅動程序本質上是軟件代碼,主要作用是計算機系統(tǒng)與硬件設備之間完成數(shù)據(jù)傳送的功能,只有借助驅動程序,兩者才能通信并完成特定的功能。如果一個硬件設備沒有驅動程序,只有操作系統(tǒng)是不能發(fā)揮特有功能的,也就是說驅動程序是介于操作系統(tǒng)與硬件之間的媒介,實現(xiàn)雙向的傳達,即將硬件設備本身具有的功能傳達給操作系統(tǒng),同時也將操作系統(tǒng)的標準指令傳達給硬件設備,從而實現(xiàn)兩者的無縫連接 [2] 。隨著電子技術的飛速發(fā)展,電腦硬件的性能越來越強大。驅動程序是直接工作在各種硬件設備上的軟件,其“驅動”這個名稱也十分形象的指明了它的功能。正是通過驅動程序,各種硬件設備才能正常運行,達到既定的工作效果。硬件如果缺少了驅動程序的“驅動”,那么本來性能非常強大的硬件就無法根據(jù)軟件發(fā)出的指令進行工作,硬件就是空有一身本領都無從發(fā)揮,毫無用武之地。這時候,電腦就正如古人所說的“萬事俱備,只欠東風”,這“東風”的角色就落在了驅動程序身上。如此看來,驅動程序在電腦使用上還真起著舉足輕重的作用。
從理論上講,所有的硬件設備都需要安裝相應的驅動程序才能正常工作。但像CPU、內存、主板、軟驅、鍵盤、顯示器等設備卻并不需要安裝驅動程序也可以正常工作,而顯卡、聲卡、網卡等卻一定要安裝驅動程序,否則便無法正常工作。這是為什么呢?這主要是由于這些硬件對于一臺個人電腦來說是必需的,所以早期的設計人員將這些硬件列為BIOS能直接支持的硬件。換句話說,上述硬件安裝后就可以被BIOS和操作系統(tǒng)直接支持,不再需要安裝驅動程序。從這個角度來說,BIOS也是一種驅動程序。但是對于其他的硬件,例如:網卡,聲卡,顯卡等等 卻必須要安裝驅動程序,不然這些硬件就無法正常工作。當然,也并非所有驅動程序都是對實際的硬件進行操作的,有的驅動程序只是輔助系統(tǒng)的運行,如android中的有些驅動程序提供輔助操作系統(tǒng)的功能,這些驅動不是linux系統(tǒng)的標準驅動,如ashmen,binder等。
驅動程序的開發(fā)工作是很具挑戰(zhàn)性的,因為必須配合著硬件與軟件上相當明確與高級的平臺技術。由于大多數(shù)的驅動程序(device drivers)運行在內核模式(kernel mode),軟件的錯誤經常造成系統(tǒng)嚴重的不穩(wěn)定,例如藍屏(blue screen),這跟過去的用戶模式(user mode)下的程序設計(例如Delphi、VB、Java)有明顯的差異性。驅動開發(fā)的原理與步驟:1,明白你手頭的硬件工作原理,包括處理器架構的知識,還有外設控制器的 datasheet 為必讀之物;2,假如你們要開發(fā)的整個系統(tǒng)是裸機程序,那你要開發(fā)的驅動程序就是一套和硬件打交道的函數(shù)庫;但是假如你們計劃在產品中使用一個操作系統(tǒng),那開發(fā)驅動之前就需要熟悉這個操作系統(tǒng)的相關內部操作原理,因為你寫的是驅動程序需要很好的“鑲嵌”到這個操作系統(tǒng)的環(huán)境中去。
微軟平臺為了大量減輕驅動程序開發(fā)人員的負擔,微軟不斷的改進驅動程序的開發(fā)軟件與架構,從早期復雜深晦的VxD,到Windows XP上的Windows Driver Model(以下簡稱WDM)開發(fā)架構,如今Windows Driver Foundation(以下簡稱WDF)已成為新一代的Windows平臺驅動程序發(fā)展架構,這個架構大量簡化了驅動程序的開發(fā)流程,更符合面向對象的精神,此架構包含了UserMode Driver Framework 與Kernel Mode DriverFramework兩種開發(fā)模式。在開發(fā)Windows平臺上的驅動程序之前,必須先安裝DDK包,支持WDM與WDF兩種架構。
Unix平臺Linux作為UNIX的一個變種,繼承了UNIX的設備管理方法,將所有的設備是具體的文件,通過文件系統(tǒng)層對設備進行訪問。這種設備管理方法可以很好地做到“設備無關性”,可以根據(jù)硬件外設的更新進行方便的擴展。Linux中的設備大致可以分為三類:字符設備,塊設備,網絡設備。字符設備沒有緩沖區(qū),以字節(jié)為單位順序處理數(shù)據(jù),不支持隨機讀寫。常見的字符設備如普通打印機、系統(tǒng)的串口、終端顯示器、嵌入式設備中的簡單按鍵、手寫板等。塊設備是指在輸入輸出時數(shù)據(jù)處理以塊為單位的設備,一般都采用緩沖技術,支持數(shù)據(jù)的隨機讀寫。典型的塊設備有硬盤、光驅等。字符設備和塊設備面向的上一層是文件系統(tǒng)層。對用戶來說,塊設備和字符設備的訪問接口都是一組基于文件的系統(tǒng)調用,如read, write等。網絡設備與塊設備和字符設備不同,網絡設備面向的上一層是網絡協(xié)議層。設備文件是一個唯一的名字(如eth0),在文件系統(tǒng)中不存在對應的節(jié)點項。內核和網絡驅動程序之間的通信使用的是一套和數(shù)據(jù)包傳輸相關的函數(shù),而不是簡單的讀寫操作。每一個設備都有一對主設備號、次設備號的參數(shù)作為唯一的標識。主設備號標識設備對應的驅動程序;次設備號用來區(qū)分具體驅動程序的實例。主設備號的獲取可以通過動態(tài)分配或指定的方式。在嵌入式系統(tǒng)中外設較少,一般采用指定的方式