設備驅動程序是操作系統內核和機器硬件之間的接口,它為應用程序屏蔽硬件的細節,一般來說,Linux的設備驅動程序需要完成如下功能:
·設備初始化、釋放;
·提供各類設備服務;
·負責內核和設備之間的數據交換;
·檢測和處理設備工作過程中出現的錯誤。
Linux下的設備驅動程序被組織為一組完成不同任務的函數的集合,通過這些函數使得Windows的設備操作猶如文件一般。在應用程序看來,硬件設備只是一個設備文件,應用程序可以象操作普通文件一樣對硬件設備進行操作,如open ()、close ()、read ()、write () 等。
Linux主要將設備分為二類:字符設備和塊設備。字符設備是指設備發送和接收數據以字符的形式進行;而塊設備則以整個數據緩沖區的形式進行。在對字符設備發出讀/寫請求時,實際的硬件I/O一般就緊接著發生了;而塊設備則不然,它利用一塊系統內存作緩沖區,當用戶進程對設備請求能滿足用戶的要求,就返回請求的數據,如果不能,就調用請求函數來進行實際的I/O操作。塊設備主要針對磁盤等慢速設備。
1.內存分配
由于Linux驅動程序在內核中運行,因此在設備驅動程序需要申請/釋放內存時,不能使用用戶級的malloc/free函數,而需由內核級的函數kmalloc/kfree () 來實現,kmalloc()函數的原型為:
void kmalloc (size_t size ,int priority);
參數size為申請分配內存的字節數,kmalloc多只能開辟128k的內存;參數priority說明若kmalloc()不能馬上分配內存時用戶進程要采用的動作:GFP_KERNEL 表示等待,即等kmalloc()函數將一些內存安排到交換區來滿足你的內存需要,GFP_ATOMIC 表示不等待,如不能立即分配到內存則返回0 值;函數的返回值指向已分配內存的起始地址,出錯時,返回0。
kmalloc ()分配的內存需用kfree()函數來釋放,kfree ()被定義為:
# define kfree (n) kfree_s( (n) ,0)
其中kfree_s () 函數原型為:
void kfree_s (void * ptr ,int size);
參數ptr為kmalloc()返回的已分配內存的指針,size是要釋放內存的字節數,若為0 時,由內核自動確定內存的大小。
2.中斷
許多設備涉及到中斷操作,因此,在這樣的設備的驅動程序中需要對硬件產生的中斷請求提供中斷服務程序。與注冊基本入口點一樣,驅動程序也要請求內核將特定的中斷請求和中斷服務程序聯系在一起。在Linux中,用request_irq()函數來實現請求:
int request_irq (unsigned int irq ,void( * handler) int ,unsigned long type ,char * name);
參數irq為要中斷請求號,參數handler為指向中斷服務程序的指針,參數type 用來確定是正常中斷還是快速中斷(正常中斷指中斷服務子程序返回后,內核可以執行調度程序來確定將運行哪一個進程;而快速中斷是指中斷服務子程序返回后,立即執行被中斷程序,正常中斷type 取值為0 ,快速中斷type 取值為SA_INTERRUPT),參數name是設備驅動程序的名稱。
4.塊設備驅動
塊設備驅動程序的編寫是一個浩繁的工程,其難度遠超過字符設備,上千行的代碼往往只能搞定一個簡單的塊設備,而數十行代碼就可能搞定一個字符設備。因此,非得有相當的基本功才能完成此項工作。下面先給出一個實例,即mtdblock塊設備的驅動。我們通
ARM的嵌入式Linux移植體驗之設備驅動
更新時間: 2008-07-24 14:13:27來源: 粵嵌教育瀏覽量:1190