Linux系統(tǒng)驅動概述.ppt
《Linux系統(tǒng)驅動概述.ppt》由會員分享,可在線閱讀,更多相關《Linux系統(tǒng)驅動概述.ppt(34頁珍藏版)》請在裝配圖網上搜索。
Linux系統(tǒng)驅動概述,驅動程序與應用程序的區(qū)別,應用程序一般有一個main函數(shù),從頭到尾執(zhí)行一個任務;應用程序可以和GLIBC庫連接驅動程序沒有main函數(shù),通過使用宏module_init(初始化函數(shù)名)將初始化函數(shù)加入內核全局初始化函數(shù)列表中,在內核初始化時執(zhí)行驅動的初始化函數(shù),從而完成驅動的初始化和注冊,之后驅動便停止等待被應用軟件調用。驅動程序中有一個宏moudule_exit(退出處理函數(shù)名)注冊退出處理函數(shù)。它在驅動退出時被調用。驅動程序中是不能使用標準C庫的,內核版本與編譯器的版本依賴,當模塊與內核鏈接時,insmod會檢查模塊和當前內核版本是否匹配,每個模塊都定義了版本符號__module_kernel_version,這個符號位于模塊文件的ELF頭的.modinfo段中。只要在模塊中包含,編譯器就會自動定義這個符號每個內核版本都需要特定版本的編譯器的支持,高版本的編譯器并不適合低版本的內核,Linux-2.4版本的insmod命令裝載模塊時,首先從/lib/modules目錄和內核相關的子目錄中查找模塊文件,如果需要從當前目錄裝載,使用insmodmodule.o。,設備驅動程序的作用,設備驅動程序將復雜的硬件抽象成一個結構良好的設備,并通過提供統(tǒng)一的程序接口為系統(tǒng)的其它部分提供使用設備的能力和方法。設備驅動程序(應該只是)為系統(tǒng)的其它部分提供各種使用設備的能力,使用設備的方法應該由應用程序決定。Linux下對外設的訪問只能通過驅動程序Linux對于驅動程序有統(tǒng)一的接口,以文件的形式定義系統(tǒng)的驅動程序:Open、Release、read、write、ioctl…驅動程序是內核的一部分,可以使用中斷、DMA等操作驅動程序需要在用戶態(tài)和內核態(tài)之間傳遞數(shù)據(jù),設備驅動程序的分類,字符設備驅動程序各種串行接口,并行接口等。塊設備驅動程序磁盤設備等網絡設備驅動程序網卡等。雜項設備驅動程序不屬于上述三種設備之外的一些設備,如SCSI,時鐘等。,在操作系統(tǒng)中的位置,設備驅動程序是內核代碼的一部分。驅動程序的地址空間是內核的地址空間。驅動程序的代碼直接對設備硬件(實際是設備的各種寄存器)進行控制(實際就是讀寫操作)。應用程序通過操作系統(tǒng)的系統(tǒng)調用執(zhí)行相應的驅動程序函數(shù)。中斷則直接執(zhí)行相應的中斷程序代碼。設備驅動程序的file_operations結構體的地址被注冊到內核中的設備鏈表中。塊設備和字符設備以設備文件的方式建立在文件系統(tǒng)中的/dev目錄下,而且每個設備都有一個主設備號和一個次設備號。,在操作系統(tǒng)中的位置,主設備號和次設備號,主設備號相同的設備使用相同的驅動程序,次設備號用于區(qū)分具體設備的實例。主設備號標識設備對應的驅動程序一個驅動程序可以控制若干個設備,次設備號提供了一種區(qū)分它們的方法系統(tǒng)增加一個驅動程序就要賦予它一個主設備號。這一賦值過程在驅動程序的初始化過程中intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);,主設備號和次設備號,創(chuàng)建設備節(jié)點,設備已經注冊到內核表中,對于設備的訪問通過設備文件(設備文件與設備驅動程序的主設備號匹配),內核會調用驅動程序中的正確函數(shù)給程序一個它們可以請求設備驅動程序的名字。這個名字必須插入到/dev目錄中,并與驅動程序的主設備號和次設備號相連使用mknod在文件系統(tǒng)上創(chuàng)建一個設備節(jié)點mknod/dev/mydevicec2540,動態(tài)分配設備號,在Documentation/device.txt文件中可以找到已經靜態(tài)分配給大部分設備的列表由于許多數(shù)字已經分配了,為新設備選擇一個唯一的號碼是很困難的如果調用register_chrdev時的major為零,函數(shù)就會選擇一個空閑號碼并做為返回值返回,動態(tài)分配的問題,動態(tài)分配的主設備號不能保證總是一樣的,無法事先創(chuàng)建設備節(jié)點可以從/proc/devices讀取cat/proc/devices利用腳本動態(tài)創(chuàng)建設備文件節(jié)點,設備管理的問題,如今,Linux支持很多不同種類的硬件。這意味著/dev中都有數(shù)百個特殊文件來表示所有這些設備。而且,這些特殊文件中大多數(shù)甚至不會映射到系統(tǒng)中存在的設備上,使用devfs,在Linux2.4的內核里引入了devfs來解決linux下設備文件管理的問題在驅動程序中通過devfs_register()函數(shù)創(chuàng)建設備文件系統(tǒng)的節(jié)點系統(tǒng)啟動的時候mount設備文件系統(tǒng)所有需要的設備節(jié)點都由內核自動管理。/dev目錄下只有掛載的設備,Linux2.6內核與devfs,Linux2.6內核引入了sysfs文件系統(tǒng)為每個系統(tǒng)的硬件樹進行分級處理Devfs在Linux2.6中被標記為舍棄的特性(在Linux2.6.15及以后的版本則取消了對它的支持),而使用udev。維護動態(tài)設備從sysfs獲得的信息,可以提供對特定設備的固定設備名。對于熱插拔的設備,這尤其重要udev是在用戶空間的腳本文件,這很容易被編輯和修改可以和hotplug腳本配合使用為了保證舊應用程序的兼容性,在嵌入式系統(tǒng)中,用devfs還是一個好方法。即使在Linux2.6.15內核以后,也可以通過ndevfs(nanodevfs)補丁提供對devfs特性的兼容。,在Linux2.6內核中使用udev,建議,在2.6.15以后的版本中使用udev使用ramfs作為udev的載體mount–tramfsnone/devudev使用的規(guī)則集位于/etc/udev/*udev的官方地址:http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html,設備驅動程序的使用方法,應用層使用open、close、read、write系統(tǒng)調用——需要編寫應用程序使用系統(tǒng)命令可以進行最基本的測試:cat/dev/urandomecho/dev/urandom>/dev/fb0ddif=/dev/touchscreenof=/var/tmp/testbs=16count=100,Linux設備驅動程序結構,結構體file_operations的定義,在include/linux/fs.h中主要包括:open,close(或者release),read,write,ioctl,poll,mmap等,簡單的Linux驅動程序原理,,Linux設備驅動程序結構的例子(1),Linux設備驅動程序結構的例子(2),/**驅動程序中使用的各種函數(shù)的原型聲明。標準的作法是將函數(shù)原型聲明*放在一個頭文件中,然后在該文件開始處使用#include引用,并在該*文件中定義。**這里我們將函數(shù)的聲明和定義放在一起。所以下面的代碼既是函數(shù)的聲明,*也是函數(shù)的定義。*/staticssize_tdemo_read(structfile*filp,char*buffsize_tcnt,loof_t*off){/*這里是read函數(shù)的代碼*/returnret;}staticssize_tdemo_write(structfile*filp,char*buffsize_tcnt,loff_t*off){/*這里是write函數(shù)的代碼*/returnret;},Linux設備驅動程序結構的例子(3),staticintdemo_ioctl(structinode*inode,structfile*filpunsignedintcmd,unsignedlongarg){/*這里是ioctl函數(shù)的代碼,它的一般格式為一個switch分支語句*switch(cmd){*caseCMD1:*...*break;*...*caseCMDn:*...*break*default:*...*break;*}*/returnret;}ioctl()函數(shù)用于控制驅動程序本身的一些特性和參數(shù),如設定驅動程序使用的緩沖區(qū)的大小,設定串行通訊的速率等。,Linux設備驅動程序結構的例子(4),staticintdemo_open(structinode*inode,structfile*filp){/*這里是open函數(shù)的代碼*/returnret;}staticintdemo_close(structinode*inode,structfile*filp){/*這里是close函數(shù)的代碼*/returnret;},上述5個函數(shù),既read(),write(),ioctl(),open(),close(),是一個字符設備驅動程序最基本的需要由驅動程序的作者完成的函數(shù)。這5個函數(shù)將對應于相應的5個系統(tǒng)調用:,Linux設備驅動程序結構的例子(5),staticstructfile_operationsdemo_fops={read:demo_read,write:demo_write,ioctl:demo_ioctl,open:demo_open,release:demo_close,};,file_operations是一個結構體類型,定義在include/linux/fs.h中。上述代碼定義了一個file_operations類型的結構體demo_fops,并將其中的一些成員賦了初值。結構體demo_fops將作為一個參數(shù)在注冊一個設備驅動程序時傳遞給內核。內核使用設備鏈表維護各種注冊的設備。不同類型的設備使用不同的鏈表。,Linux設備驅動程序結構的例子(6),staticint__initdemo_init(void){/*設備初始化代碼等*/if(register_chrdev(DEMO_MAJOR,“demo”,},Linux設備驅動程序結構的例子(7),module_init(demo_init);module_exit(demo_exit);這兩個函數(shù),module_init()和module_exit(),用于告訴內核,當一個驅動程序加載和退出(或撤消)時,需要執(zhí)行的操作。不同驅動程序在加載和退出時,除了基本的向內核注冊設備驅動程序外,還有各自的針對具體設備的操作。,Linux設備驅動程序結構的例子(8),要點總結:宏:__KERNEL__,MODULE,__VERSION____KERNEL__:表明這將是用于內核的代碼,否則很多內核過程將無法使用。MODULE:如果是以模塊方式編譯,需要定義這個宏;如果是靜態(tài)連接則不用。__VERSION__:定義這個宏則需要驅動程序的內核版本要和內核版本一致。module_init()/module_exit():[demo_init()/demo_exit()]每個驅動程序都要有這兩個函數(shù),它們分別用于設備驅動程序的加載和撤消。staticstructfile_operationsdemo_fops:每個驅動程序都要有這樣的結構體,可能不止一個。用register_chrdev()注冊驅動程序時這個結構體的起始地址被傳送到內核的設備表中。DEMO_MAJOR:每個設備驅動程序有一個主設備號(majornumber)。不同設備驅動程序不能使用相同的主設備號。一個設備驅動程序可以管理不同的(但一般是同一類的)設備,通過次設備號(minornumber)區(qū)分。demo_open()/close(),read()/write(),ioctl():根據(jù)具體驅動程序定義和使用。一般open()/close()總是需要的,而且open()和close()一定要成對出現(xiàn)。,設備驅動程序的使用,驅動程序模塊的動態(tài)鏈接和靜態(tài)鏈接創(chuàng)建設備文件使用設備,驅動程序模塊的加載,設備驅動程序被靜態(tài)編譯到內核中的情況:module_init()指示內核在啟動過程中運行設備的初始化函數(shù),如demo_init()函數(shù)。驅動程序的加載隨內核的啟動一起完成。靜態(tài)編譯的內核模塊不能被動態(tài)卸載,只有到系統(tǒng)關閉時由內核執(zhí)行相應的卸載函數(shù),如demo_exit()。嵌入式操作系統(tǒng)一般使用靜態(tài)內核模塊以減少系統(tǒng)的尺寸和復雜性。設備驅動程序被動態(tài)加載到內核中的情況:首先,驅動程序需要被編譯成目標文件,如demo.o。在操作系統(tǒng)運行之后,使用insmod命令將驅動程序模塊動態(tài)加載到內核中$insmoddemo.o使用insmod命令動態(tài)加載的內核模塊可以使用rmmod命令動態(tài)地從內核中卸載$rmmoddemo.o使用內核的動態(tài)模塊加載/卸載功能需要內核支持kmod功能。,創(chuàng)建設備文件,使用設備驅動,應用程序??系統(tǒng)調用??設備驅動程序??設備(寄存器)使用一個設備一般需要執(zhí)行如下一些操作:1.打開設備文件。2.對設備進行必要的設置,如設置串口速率。3.對設備進行讀、寫等操作,如通過串口收發(fā)數(shù)據(jù)。4.結束對設備的使用之前,如果改變了設備的某些設置,則將其恢復到缺省狀態(tài),保證設備停用后沒有任何不好的副作用。5.關閉設備。,,,,使用設備驅動,Linux的驅動開發(fā)調試有兩種方法,直接編譯到內核,再運行新的內核來測試。效率較低,但在某些場合是唯一的方法編譯為模塊的形式,單獨加載運行調試。模塊方式調試效率很高,它使用insmod工具將編譯的模塊直接插入內核,如果出現(xiàn)故障,可以使用rmmod從內核中卸載模塊。不需要重新啟動內核,這使驅動調試效率大大提高。,模塊方式驅動程序編譯的兩種方法,在內核中編譯?!皡⒖純群说囊浦埠途幾g.ppt中”的一個demo驅動程序編譯的例子獨立編譯。在驅動源代碼目錄下編寫makefile鏈接內核源代碼,將它編譯為模塊。,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- Linux 系統(tǒng) 驅動 概述
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://www.820124.com/p-3343896.html