設(shè)備驅(qū)動程序_第1頁
已閱讀1頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、驅(qū)動程序,xlanchen@2006.6.22,xlanchen@2006.6.22,Embedded Operating Systems,2,設(shè)備文件,Unix類操作系統(tǒng)都是基于文件概念的文件是以字符序列而構(gòu)成的信息載體,因此一個I/O設(shè)備也可以當(dāng)作文件來處理與普通文件交互的系統(tǒng)調(diào)用也可以直接用于I/O設(shè)備例如對/dev/lp0設(shè)備文件的write()可以將數(shù)據(jù)發(fā)往打印機(jī),xlanchen@2006.6.22,Embedded

2、Operating Systems,3,設(shè)備文件的分類,根據(jù)設(shè)備驅(qū)動程序的基本特性,設(shè)備文件可以分為:字符設(shè)備塊設(shè)備塊設(shè)備數(shù)據(jù)可以被隨機(jī)訪問在用戶看來,訪問任何位置的數(shù)據(jù)時間大致相同典型例子:硬盤、軟盤、CD-ROM、DVD播放器等,xlanchen@2006.6.22,Embedded Operating Systems,4,,字符設(shè)備要么不可以隨機(jī)訪問,例如聲卡如果可以被隨機(jī)訪問(往往通過順序訪問方式實現(xiàn)),但隨著數(shù)

3、據(jù)的位置的不同,其訪問時間會相差很大,例如磁帶網(wǎng)絡(luò)由于網(wǎng)卡不與文件相關(guān)聯(lián),使用專門的處理方式,xlanchen@2006.6.22,Embedded Operating Systems,5,老式的設(shè)備文件,在Linux2.4中存在兩種設(shè)備文件老式的設(shè)備文件Devfs設(shè)備文件老式的設(shè)備文件這是存放在文件系統(tǒng)中的實際文件索引節(jié)點不對磁盤上的數(shù)據(jù)塊編址,而是包含硬件設(shè)備的一個標(biāo)識每個文件設(shè)備包括:名字、類型(字符/塊)設(shè)備

4、號(主設(shè)備號:次設(shè)備號),xlanchen@2006.6.22,Embedded Operating Systems,6,,mknod()系統(tǒng)調(diào)用用來創(chuàng)建老式的設(shè)備文件,設(shè)備文件名,,操作權(quán)限和設(shè)備類型其中設(shè)備類型指定:S_IFCHR或S_IFBLK,,設(shè)備號16位,主設(shè)備號:次設(shè)備號,,xlanchen@2006.6.22,Embedded Operating Systems,7,,設(shè)備文件通常包含在/dev目錄中一些設(shè)

5、備文件的例子,xlanchen@2006.6.22,Embedded Operating Systems,8,,注意:字符設(shè)備與塊設(shè)備具有獨立的編號,例如,塊設(shè)備(3,0)不同于字符設(shè)備(3,0)設(shè)備文件通??梢员硎疽粋€硬件設(shè)備,例如磁盤/dev/hda或硬件設(shè)備的某一物理或邏輯分區(qū),例如磁盤分區(qū)/dev/hda2或一個虛擬的邏輯設(shè)備(不會與任何硬件設(shè)備相關(guān)聯(lián)),例如/dev/null代表一個“黑洞”,xlanchen@20

6、06.6.22,Embedded Operating Systems,9,,對內(nèi)核而言,一個設(shè)備文件的名字是無關(guān)緊要的,關(guān)鍵在于設(shè)備文件的類型及其主次設(shè)備號例如,建立一個設(shè)備文件/tmp/disk,其類型為塊設(shè)備,設(shè)備號為(3,0),那么內(nèi)核認(rèn)為它與/dev/had等價,xlanchen@2006.6.22,Embedded Operating Systems,10,Devfs設(shè)備文件,使用主次設(shè)備號標(biāo)識設(shè)備存在局限性在/dev中的

7、大多數(shù)設(shè)備是不存在的8位長的主次設(shè)備號不夠用上述原因以及其他的一些因素綜合起來,促使了devfs設(shè)備文件的產(chǎn)生Devfs虛擬文件系統(tǒng)允許設(shè)備驅(qū)動程序通過名字而不是主次設(shè)備號注冊設(shè)備,例如所有的磁盤可以放在/dev/disks目錄下/dev/hda?/dev/disks/disc0/dev/hdb?/dev/disks/disc1,xlanchen@2006.6.22,Embedded Operating Systems,11

8、,,使用devfs文件系統(tǒng)的I/O驅(qū)動程序通過調(diào)用devfs_register()注冊設(shè)備一個注冊了的設(shè)備文件自動出現(xiàn)在devfs的虛擬目錄下,xlanchen@2006.6.22,Embedded Operating Systems,12,設(shè)備文件的VFS處理,進(jìn)程訪問普通文件時,通過文件系統(tǒng)訪問磁盤分區(qū)中的數(shù)據(jù)塊當(dāng)進(jìn)程訪問設(shè)備文件時,卻可以驅(qū)動硬件設(shè)備例如,進(jìn)程訪問計算機(jī)上的溫度計對應(yīng)的設(shè)備文件獲得溫度HOW?VFS,x

9、lanchen@2006.6.22,Embedded Operating Systems,13,VFS,VFS在設(shè)備文件打開時使用與設(shè)備相關(guān)的函數(shù)調(diào)用替換其缺省的文件操作這些設(shè)備相關(guān)函數(shù)調(diào)用對硬件設(shè)備進(jìn)行操作,xlanchen@2006.6.22,Embedded Operating Systems,14,設(shè)備驅(qū)動程序,這是一個軟件層,使得硬件設(shè)備能夠響應(yīng)預(yù)定義好的編程接口,就是一組控制設(shè)備的VFS函數(shù)接口open,read,lse

10、ek,ioctl等上述函數(shù)的具體實現(xiàn)由設(shè)備驅(qū)動程序提供此外設(shè)備驅(qū)動程序必須首先注冊并初始化自己并在進(jìn)行數(shù)據(jù)傳送的時候監(jiān)控I/O操作,xlanchen@2006.6.22,Embedded Operating Systems,15,注冊設(shè)備驅(qū)動程序,注冊一個設(shè)備驅(qū)動程序意味著把它與對應(yīng)的設(shè)備文件連接起來使得對設(shè)備文件發(fā)出的系統(tǒng)調(diào)用可以由內(nèi)核轉(zhuǎn)化為相應(yīng)的設(shè)備驅(qū)動程序?qū)?yīng)的函數(shù)訪問一個沒有注冊設(shè)備驅(qū)動程序的設(shè)備文件將會返回錯誤碼-

11、ENODEV,xlanchen@2006.6.22,Embedded Operating Systems,16,,注冊時機(jī)如果設(shè)備驅(qū)動程序被靜態(tài)編譯進(jìn)內(nèi)核,則注冊發(fā)生在內(nèi)核初始化階段如果作為一個內(nèi)核模塊來編譯,則在裝入模塊的時候注冊(并在卸載模塊時注銷),xlanchen@2006.6.22,Embedded Operating Systems,17,設(shè)備驅(qū)動程序的初始化,對設(shè)備驅(qū)動程序進(jìn)行注冊與初始化是兩件不同的事情注冊應(yīng)當(dāng)盡早

12、:使得用戶可以使用設(shè)備文件初始化應(yīng)當(dāng)推遲到最后可能的時候原因:初始化就意味著需要分配系統(tǒng)中的稀缺資源,例如:1,中斷向量(動態(tài)分配的情況下)2,用于DMA傳送的緩沖區(qū)的頁框3,包括DMA通道本身,xlanchen@2006.6.22,Embedded Operating Systems,18,監(jiān)控I/O操作,I/O操作的持續(xù)時間通常不可預(yù)知,可能與各種因素相關(guān),例如機(jī)械裝置的狀態(tài),如對于磁盤來講,磁頭的當(dāng)前位置或?qū)嶋H的隨機(jī)

13、事件,例如數(shù)據(jù)包何時到達(dá)網(wǎng)卡以及人為因素,例如人對鍵盤、鼠標(biāo)的使用,以及發(fā)現(xiàn)打印機(jī)卡紙時的操作為此設(shè)備驅(qū)動程序必須通過某種監(jiān)控手段監(jiān)控I/O操作終止或超時,xlanchen@2006.6.22,Embedded Operating Systems,19,,兩種可用的技術(shù)輪詢模式(polling mode)CPU重復(fù)檢查(輪詢)設(shè)備的狀態(tài)寄存器,直到寄存器的值表明I/O操作已經(jīng)完成為止中斷模式(interrupt mode)如

14、果I/O控制器能夠通過IRQ線發(fā)出I/O操作結(jié)束的信號,就可以使用中斷模式,xlanchen@2006.6.22,Embedded Operating Systems,20,輪詢模式的簡單例子,Why ”--count”也可以使用jiffies進(jìn)行超時判斷若時間比較長,比如ms級,可以在每次輪詢操作之后調(diào)用schedule主動放棄CPU,直到下次被調(diào)度再次輪詢,可以用來粗略的判斷超時,xlanchen@2006.6.22,Embe

15、dded Operating Systems,21,中斷模式的簡單例子,假定實現(xiàn)一個簡單的輸入字符設(shè)備的驅(qū)動程序當(dāng)在對應(yīng)的設(shè)備文件上發(fā)出read()系統(tǒng)調(diào)用時,一條輸入命令被發(fā)往設(shè)備的控制寄存器在一個不可預(yù)知的長時間后,設(shè)備把一個字節(jié)的數(shù)據(jù)放在輸入寄存器驅(qū)動程序然后將這個字節(jié)作為read()系統(tǒng)調(diào)用的結(jié)果返回,xlanchen@2006.6.22,Embedded Operating Systems,22,,這個驅(qū)動程序包含兩個函

16、數(shù):實現(xiàn)文件對象read方法的foo_read()函數(shù)處理中斷的foo_interrupt()函數(shù),只要用戶讀設(shè)備文件,foo_read()函數(shù)就會被觸發(fā),,對I/O設(shè)備發(fā)出讀命令,,等待讀操作的結(jié)束,由中斷處理程序喚醒,,將獲得的數(shù)據(jù)送到用戶空間中,xlanchen@2006.6.22,Embedded Operating Systems,23,,,,從設(shè)備上讀入數(shù)據(jù),,喚醒read的剩余部分,xlanchen@2006.6.2

17、2,Embedded Operating Systems,24,,再看foo_read的輸入?yún)?shù)Struct file*filp,在這個數(shù)據(jù)的私有數(shù)據(jù)項中,VFS已經(jīng)將其轉(zhuǎn)換成設(shè)備驅(qū)動程序的私有的信息foo_dev_t, 被定義為包含如下信息:一個信號量,互斥使用intr作為標(biāo)志0:沒有發(fā)生/處理中斷1:處理了中斷一個等待隊列,用來給foo_read睡眠一個數(shù)據(jù)區(qū),長度為1,用來存放讀到的數(shù)據(jù),xlanchen@2006

18、.6.22,Embedded Operating Systems,25,,char* buf,用戶提供的存放數(shù)據(jù)的空間Count和ppos都沒有用到再看看foo_interrupt()中,這是通過foo一個全局變量獲得設(shè)備的私有數(shù)據(jù)結(jié)構(gòu)的,這個數(shù)據(jù)結(jié)構(gòu)與foo_read()中通過filp中獲得的私有數(shù)據(jù)一致foo_interrupt的輸入?yún)?shù)沒有得到使用,這是一種很普遍的情況,xlanchen@2006.6.22,Embedded

19、 Operating Systems,26,塊設(shè)備驅(qū)動程序,典型的塊設(shè)備驅(qū)動程序都有很高的平均訪問時間,例如磁盤的每次操作都需要幾個ms,主要是為了定位磁頭,一旦定位后,就可以以穩(wěn)定的高速率傳輸數(shù)據(jù)(幾十MB/秒)定義:相鄰的數(shù)據(jù)指當(dāng)數(shù)據(jù)以相鄰的方式存放在磁表面時,一次單獨操作就可以訪問它們,xlanchen@2006.6.22,Embedded Operating Systems,27,,內(nèi)核對塊設(shè)備處理程序的支持具有以下特點:

20、通過VFS提供統(tǒng)一接口對磁盤數(shù)據(jù)進(jìn)行有效的預(yù)讀為數(shù)據(jù)提供磁盤高速緩存,xlanchen@2006.6.22,Embedded Operating Systems,28,用于塊設(shè)備文件的缺省的文件操作方法,,xlanchen@2006.6.22,Embedded Operating Systems,29,塊設(shè)備請求及其優(yōu)化,雖然塊設(shè)備驅(qū)動程序可以一次傳送一個單獨的數(shù)據(jù)塊,但是內(nèi)核并不會為每個要訪問的數(shù)據(jù)塊都執(zhí)行一次I/O操作內(nèi)核試

21、圖把幾個塊合并在一起,作為一個整體來處理,從而減少磁頭的平均移動時間HOW?,xlanchen@2006.6.22,Embedded Operating Systems,30,,為讀寫一個磁盤塊的請求生成塊設(shè)備請求但推遲這個請求執(zhí)行的時間這是提高塊設(shè)備性能的關(guān)鍵機(jī)制當(dāng)請求發(fā)生時,內(nèi)核檢查是否能通過稍微擴(kuò)展前一個一直處于等待狀態(tài)的請求而滿足新的請求,從而減少定位的時間,提高效率,xlanchen@2006.6.22,Embedd

22、ed Operating Systems,31,,每個塊設(shè)備驅(qū)動程序都維護(hù)著自己的請求隊列;每個物理塊設(shè)備應(yīng)當(dāng)有一個請求隊列請求可以以提高磁盤性能的方式進(jìn)行排序低級的設(shè)備驅(qū)動程序一般采用如下策略:處理請求隊列上的第一個請求,并設(shè)置設(shè)備控制器,以便在數(shù)據(jù)傳送完成時可以產(chǎn)生一個中斷,然后就停止當(dāng)設(shè)備控制器產(chǎn)生中斷時,中斷處理程序就激活下半部分。下半部分將被處理的請求刪除,并繼續(xù)1,xlanchen@2006.6.22,Embed

23、ded Operating Systems,32,驅(qū)動程序的編寫,有專門的書《Linux設(shè)備驅(qū)動程序》來講如何寫Linux下的驅(qū)動程序中譯本有500多頁我們這里用最簡單的例子來嘗試驅(qū)動程序的編寫,xlanchen@2006.6.22,Embedded Operating Systems,33,,1,確定設(shè)備名稱與主次設(shè)備號(動態(tài)分配的不指定)2,編寫設(shè)備文件對內(nèi)核上層的接口file_operations包括:init, op

24、en, release, read, write, ioctl等3,編譯并加載設(shè)備驅(qū)動(兩種方法)3.1,靜態(tài)加載:3.1.1,將初始化函數(shù)加入內(nèi)核驅(qū)動初始化部分3.1.2,修改相應(yīng)的Makefile, 增加驅(qū)動的目標(biāo)文件3.1.3,重新編譯內(nèi)核,啟用新的內(nèi)核,xlanchen@2006.6.22,Embedded Operating Systems,34,,3.2,動態(tài)加載,先編譯成Linux模塊目標(biāo)文件,再

25、用insmod將驅(qū)動模塊加載,還有rmmod, lsmod命令,可查看man得知相應(yīng)的功能。4,在目錄/dev下建立相應(yīng)的設(shè)備文件。mknod 創(chuàng)建設(shè)備對象,參數(shù): 設(shè)備名 設(shè)備類型 主設(shè)備號 次設(shè)備號5,在用戶態(tài)下編寫應(yīng)用程序測試,使用該設(shè)備驅(qū)動,xlanchen@2006.6.22,Embedded Operating Systems,35,一個虛擬的字符驅(qū)動程序舉例,Char_dev.cMakefileTestchar

26、dev.c設(shè)備名定為:char_dev用命令insmod char_dev.o加載用命令lsmod察看是否成功加載使用dmesg察看主設(shè)備號使用mknod char_dev c 253 1在/dev目錄下創(chuàng)建設(shè)備文件運行Testchardev.c測試,xlanchen@2006.6.22,Embedded Operating Systems,36,課程回顧,嵌入式操作系統(tǒng)開發(fā)Linux內(nèi)核主要模塊分析Linux上的應(yīng)用

溫馨提示

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

評論

0/150

提交評論