基于嵌入式Linux的設備驅動程序設計_第1頁
免費預覽已結束,剩余5頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、基于嵌入式linux的設備驅動程序設計為是一個成熟而穩(wěn)定的操作系統(tǒng)。將linux植入設備具有眾多的優(yōu)點,包括可剪裁和簡單移植等,所以linux操作系統(tǒng)在嵌入式領域獲得了廣泛的應用。嵌入式linux向來是嵌入式領域的討論熱點,與pc架構不同,嵌入式系統(tǒng)的硬件具有多樣性和差異性,嵌入式系統(tǒng)的開發(fā)需要對特定系統(tǒng)舉行硬件設計,同時還要針對這些硬件來編寫驅動程序。linux內核就是通過驅動程序來同外圍設備打交道的,系統(tǒng)設計人員必需為每個設備編寫驅動程序,否則設備無法在操作系統(tǒng)下正常工作。1 設備驅動程序設計的基本概念與模型設備驅動程序是操作系統(tǒng)內核與機器硬件之間的接口,它為應用程序屏蔽了硬件的詳情,在應

2、用程序看來,硬件設備只是一個設備文件,應用程序可以象操作一般文件一樣對硬件設備舉行操作,設計驅動程序是內核的一部分,可以實現(xiàn)以下功能:對設備初始化和釋放;把數據從內核傳送到硬件,以及從硬件讀取數據;讀取應用程序傳送給設備文件的數據,以及回送應用程序哀求的數據;檢測和處理設備浮現(xiàn)的錯誤。前面已經提到驅動程序的作用,而編寫驅動程序就是構造一系列可供給用程序調動的函數(包括open、release、read、write、llseek、ioctl等)。在用戶自己的驅動程序中,首先要按照驅動程序的功能,實現(xiàn)file_operations結構中的函數,不需要的函數接口可以挺直在file_operation

3、s結構中初始化為null;file_operations變量會在驅動程序初始化時注冊到系統(tǒng)內部。當操作系統(tǒng)對設備操作時,會調用驅動程序注冊的file_operations結構中的函數指針。以下是嵌入式linux2.4設備驅動程序的最簡模型。詳細實現(xiàn)前面定義的函數時,需注重下面幾點:1)在test_init函數中要通過調用register_chrdev()函數來向內核注冊字符設備驅動程序。假如是塊設備,則還需調用mmmap()舉行地址空間的映射,再調用register_blkdev()函數來向內核注冊塊設備驅動程序,在linux系統(tǒng)中,對中斷的處理是屬于系統(tǒng)核心部分,因而假如設備與系統(tǒng)之間以中斷

4、方式舉行數據交換,則必需把該設備的驅動程序作為系統(tǒng)核心的一部分,也就是說設備驅動程序要通過調用request_irq()函數來申請中斷,通過free_irq()函數來釋放中斷(在test_cleanup中實現(xiàn))。2)open()函數和release()函數的詳細實現(xiàn)有著一定的對應性,在open()函數中主要是執(zhí)行打開設備時的一些初始化代碼,假如該驅動程序需要管理多個設備,那么還要獵取從設備號,按照從設備號來推斷需要操作的設備,其中,從設備號可通過調用函數minor(inode->i_rdev)來獲得,然后再調用宏mod_inc_use_count來使得驅動程序用法計數器加1,而在rele

5、ase()函數中則要舉行相反的處理。即調用宏mod_dec_use_count來減小驅動程序用法計數器。3)歸根到底,驅動函數的實現(xiàn)就是調用內核所支持的函數(包括內核提供的api和用戶自己定義的寄存器操作函數)來完成對設備的操作,雖然嵌入式系統(tǒng)設備的種類眾多,不同設備操作的詳細實現(xiàn)辦法不行能相同,但是linux操作系統(tǒng)提供了一系列特別api,為開發(fā)內核驅動程序帶來了很大的便利,調用這些api時需要注重的是:通常狀況下,應用程序是通過內核接口拜訪驅動程序的(這是驅動程序的主要用法方式),因此驅動程序需要與應用程序交換數據,但是操作系統(tǒng)內核和驅動程序在內核空間中運行,而用戶程序在用戶空間中運行,用

6、戶程序不能拜訪內核空間,操作系統(tǒng)內核和驅動程序也不能用法指針或memcpy()等常規(guī)的c庫函與用戶空間傳輸數據,造成這種情況的主要緣由是linux操作系統(tǒng)用法了虛擬內存機制,用法了虛擬內存機制后,用戶空間的內存可能被換出,當內核用法用戶空間指針時,對應的頁面可能已經不在內存中了,因此在用法調用函數時要注重:設備驅動程序在申請和釋放內存時不是調用malloc()和free(),而調用kmalloc()和kfree();用于內核空間與用戶空間舉行數據拷貝的函數主要有access_ok()(檢查某內存空間是否有權拜訪),copy_to_user()和put_usr()(內核函數向用戶空間傳輸數據),

7、copy_from_user()和get_user()(用戶空間向內核空間傳輸數據);關于內核空間與i/o空間的數據交換,不同體系結構的處理器對i/o的處理方式也不同,x86系列處理器中,i/o與內存完成不同,它是分開編址的,拜訪它要用法專用的命令;而對體系結構的處理器來說,則是不區(qū)別i/o和內存,統(tǒng)一編址的,可以用法同樣的命令拜訪,在驅動程序中可以用法一系列函數來拜訪i/o口,如outb()、outw()、outl()inb()、inw()、inl()、outsb()、outsw()、outsl()、insb()、insw()和insl()等。2 linux2.6與2.4內核驅動程序的區(qū)分為

8、了徹底防止對正在被用法的內核模塊舉行錯誤操作,linux2.6內核在加載和導出內核模塊方面都較2.4內核有所改進,避開了用戶執(zhí)行將導致系統(tǒng)崩潰的操作(例如強制刪除模塊等)。同時,當驅動程序需要在多個文件中包含頭文件時,不必然義宏來檢查內核的版本。與2.4內核相比,2.6內核在可擴展性、吞吐率等方面有較大提升,其新特性主要包括:用法了新的調度器算法;內核搶占功能顯著地降低了用戶交互式應用程序;多媒體應用程序等類似應用程序的延遲;改進了線程模型以及對nptl的支持,顯著充實了虛擬內存在一定成程度負載下的性能;能夠支持更多的文件系統(tǒng);引進了內存池技術;支持更多的系統(tǒng)設備,在2.4內核中有約束大型系統(tǒng)

9、的限制,其支持的每一類設備的最大數量為256,而2.6內核則徹底打破了這些限制,可以支持4095種主要的設備類型,且每個單獨的類型又可以支持超過一百萬個的子設備;支持反向映射機制(reverse mapping),內存管理器為每一個物理頁建立一個鏈表,包含指向當前映射頁中每個進程的頁表條目的指針。該鏈表叫pte鏈,它極大的提高了找到那些映射某個頁的進程的速度。linux操作系統(tǒng)的設備驅動程序是在內核空間運行的程序,其中涉及無數內核的操作,隨著linux內核版本的升級,驅動程序的開發(fā)必定也要作出相應的修改,總之,在linux2.6內核上編寫設備驅動程序時詳細要注重以下幾個方面:1)linux2.

10、6內核驅動程序必需由module_license("dual bsd/gpl")語句來定義許可證,而不能再用2.4內核的module_license("gpl")。否則,在編譯時會浮現(xiàn)警告提醒。2)linux2.6內核驅動程序可以用int try_module_get(&module)來加載模塊,用module_put()函數來卸載模塊,而以前2.4內核用法的宏mod_inc_use_count和mod_dec_use_count則可不用。3)前面給出的字符型設備驅動程序模型中結構體file_operations的定義要采納下面的形式。這是由于在

11、linux內核中對結構體的定義形式發(fā)生了變幻,不再支持本來的定義形式。4)就字符型設備而言,test_open()函數中向內核注冊設備的調用函數register_chrdev()可以升級為int register_chrdev_region(dev_t from,unsigned count,char * name),假如要動態(tài)申請主設備號可調用函數int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,char * name)來完成;本來的注冊函數還可以用,只是不能注冊設備號大于256的設備,同理,對于塊設備

12、和網絡設備的注冊函數也有著相對應的代替函數。5)在聲明驅動程序是否要導出符號表方面有著很大的變幻。當驅動程序模塊裝入內核后,它所導出的任何符號都會變成公共符合表的一部分,在/proc/ksyms中可以看到這些新增強的符號。通常狀況之下,模塊只需實現(xiàn)自己的功能,不必導出任何符號,然而,假如有其他模塊需要用法模塊導出的符號時,就必需導出符號,惟獨顯示的導出符號才干被其他模塊用法,linux2.6內核中默認不導出全部的符號,不必用法export_no_symbols宏來定義;而在2.4內核中恰恰相反,它默認導出全部的符號,除非用法export_no_symbols,因此在上面給出的范例中可以省略去該

13、定義語句。6)linx內核統(tǒng)一了無數設備類型,同時也支持更大的系統(tǒng)和更多的設備,本來linux2.4內核中的變量kdev_t已經被廢除不行用,取而代之的是dev_t。它拓展到了32位,其中包括12位主設備號和20位次設備號。調用函數為unsigned int iminor(struct inode * inode)和unsigned int imajor(struct inode * inode),而不再用linux2.4版本中的int major(kdev_t dev)和int minor(kdev_t dev)。7)全部的內存分配函數不再包含在頭文件中,而是包含在中,而本來的已經不存在。所

14、以當在驅動程序中要用到函數kmalloc()或kfree()等內存分配函數時,就必需要定義頭文件而不是。同時,前面提到的申請內存和釋放內存函數的詳細參數也有了一定的轉變,包括:分配標記gfp_buffer被取消,取而代之的是gfp_noio和gfp_nofs;新增了_gfp_repeat、_gfp_nofail和_gfp_noretry分配標記等,使得內存操作越發(fā)便利。8)由于內核中有些地方的內存分配是不允許失敗的,所以為了確保這種狀況下得勝利分配,linux2.6版本內核中開發(fā)了一種稱為"內存池"的抽象。內存池其實相當于后備的高速緩存,以便在緊張狀態(tài)下用法。要用法內存池的處理函數時,必需包含頭文件。內存池處理函數主要有以下幾個:mempool_t *mempool_create()、void*mempool_alloc()、void mempool_free()、int mempool_resize();另外值得一提的是:2.6內核為了區(qū)分以.o為擴展名的常規(guī)對象文件,將內核模塊的擴展名改

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論