資源描述:
《Linux 設備驅(qū)動程序ppt課件.ppt》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在教育資源-天天文庫。
1、Linux設備驅(qū)動程序開發(fā)基礎主講人:TonyShen課程目標Linux設備驅(qū)動程序開發(fā)簡介Linux設備驅(qū)動程序結(jié)構Linux設備驅(qū)動程序加載方式實驗:編寫一個字符設備驅(qū)動程序(LED或蜂鳴器)分別用靜態(tài)編譯,模塊動態(tài)加載方法實現(xiàn)加入內(nèi)核設備驅(qū)動程序應用程序驅(qū)動程序設備writereadioctlioctl設備驅(qū)動程序特點⑴核心代碼:設備驅(qū)動程序是核心的一部分,像核心中其他的代碼一樣,出錯將導致系統(tǒng)的嚴重損傷。一個編寫不當?shù)脑O備驅(qū)動程序甚至能夠使系統(tǒng)崩潰導致文件系統(tǒng)的破壞和數(shù)據(jù)的丟失;⑵標準接口:設備驅(qū)動程序
2、必須為Linux核心或者其從屬的子系統(tǒng)提供一個標準的接口;⑶核心機制:設備驅(qū)動程序可以使用標準的核心服務比如內(nèi)存分配、中斷發(fā)送和等待對列等;⑷動態(tài)可加載:多數(shù)的Linux設備驅(qū)動程序可以在核心模塊發(fā)出加載請求時進行加載,同時在不使用設備時進行卸載,這樣核心可以有效地利用系統(tǒng)的資源⑸可配置:Linux設備驅(qū)動屬于核心的一部分,用戶可以根據(jù)自己的需要進行配置來選擇適合自己的驅(qū)動用戶態(tài)與內(nèi)核態(tài)Linux運轉(zhuǎn)在兩種模式下,一種是用戶態(tài),另一種是內(nèi)核態(tài)。內(nèi)核態(tài)有較高的權限,可以控制處理器內(nèi)存的映射和分配方式,訪問外設空間和
3、處理器狀態(tài)寄存器,控制中斷等。用戶態(tài)只能運行系統(tǒng)上的應用程序。驅(qū)動程序作為系統(tǒng)內(nèi)核的一部分,工作在內(nèi)核態(tài)。通過get_userput_usercopy_from_usercopy_to_user等函數(shù)實現(xiàn)應用程序和驅(qū)動程序之間傳送數(shù)據(jù)(指針)。Linux設備的分類字符設備以字節(jié)為單位逐個進行I/O操作字符設備中的緩存是可有可無不支持隨機訪問如串口設備塊設備塊設備的存取是通過buffer、cache來進行可以進行隨機訪問例如IDE硬盤設備可以支持可安裝文件系統(tǒng)網(wǎng)絡設備通過BSD套接口訪問設備文件Linux抽象了對硬
4、件的處理,所有的硬件設備都可以作為普通文件一樣來看待可以使用和操作文件相同的、標準的系統(tǒng)調(diào)用接口來完成打開、關閉、讀寫和I/O控制操作對用戶來說,設備文件與普通文件并無區(qū)別字符設備和塊設備是通過文件節(jié)點訪問的。在Linux的文件系統(tǒng)中,可以找到(或者使用mknod創(chuàng)建)設備對應的文件名,稱這種文件為設備文件。設備文件命令ls–l/dev可列出系統(tǒng)的設備文件主設備號和次設備號主設備號:標識該設備的種類,也標識了該設備所使用的驅(qū)動程序主設備號的范圍只能是1-255Linux內(nèi)核支持動態(tài)分配主設備號次設備號:標識使用同
5、一設備驅(qū)動程序的不同硬件設備?同一個驅(qū)動程序可以管理多個設備,它們依靠次設備號來區(qū)別。次設備號只在驅(qū)動程序內(nèi)部使用,系統(tǒng)內(nèi)核直接把次設備號傳遞給驅(qū)動程序,由驅(qū)動程序去管理。設備文件系統(tǒng)Linux內(nèi)核自己管理設備文件,完成設備文件節(jié)點的創(chuàng)建、刪除。(devfs,devicefilesystem)在linux2.4/2.6內(nèi)核中,設備文件系統(tǒng)可在配置內(nèi)核時定制。linux2.4內(nèi)核配置層次Filesystems->/devfilesystemsupportlinux2.6內(nèi)核配置層次Filesystems->Pseu
6、dofilesystem->/devfilesystemsupport系統(tǒng)驅(qū)動程序通過CONFIG_DEVFS_FS宏定義判斷系統(tǒng)是否有對設備文件系統(tǒng)的支持。配置設備文件系統(tǒng)Linux設備驅(qū)動程序結(jié)構Linux設備驅(qū)動程序的代碼結(jié)構大致可以分為如下幾個部分:驅(qū)動程序的注冊與注銷、設備的打開與釋放、設備的讀寫操作、設備的控制操作、設備的中斷和輪詢處理。一個最簡單字符驅(qū)動程序,由下面5個函數(shù)和1個結(jié)構體就可組成。staticintmy_open(structinode*inode,structfile*filp){設
7、備打開時的操作…}staticintmy_release(structinode*inode,structfile*filp){設備關閉時的操作…}staticintmy_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos){設備寫入時的操作…}驅(qū)動程序結(jié)構staticstructfile_operationsmy_fops={對文件操作結(jié)構體成員定義初始值…}staticint__initmy_init(void){初始化硬件,注冊設備,
8、創(chuàng)建設備節(jié)點…}staticvoid__exitmy_exit(void){刪除設備節(jié)點,注銷設備…}頭文件與系統(tǒng)定義#include#include#include#include#include#inc