

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、驅(qū)動(dòng)程序,xlanchen@2006.6.22,xlanchen@2006.6.22,Embedded Operating Systems,2,設(shè)備文件,Unix類操作系統(tǒng)都是基于文件概念的文件是以字符序列而構(gòu)成的信息載體,因此一個(gè)I/O設(shè)備也可以當(dāng)作文件來(lái)處理與普通文件交互的系統(tǒng)調(diào)用也可以直接用于I/O設(shè)備例如對(duì)/dev/lp0設(shè)備文件的write()可以將數(shù)據(jù)發(fā)往打印機(jī),xlanchen@2006.6.22,Embedded
2、Operating Systems,3,設(shè)備文件的分類,根據(jù)設(shè)備驅(qū)動(dòng)程序的基本特性,設(shè)備文件可以分為:字符設(shè)備塊設(shè)備塊設(shè)備數(shù)據(jù)可以被隨機(jī)訪問(wèn)在用戶看來(lái),訪問(wèn)任何位置的數(shù)據(jù)時(shí)間大致相同典型例子:硬盤(pán)、軟盤(pán)、CD-ROM、DVD播放器等,xlanchen@2006.6.22,Embedded Operating Systems,4,,字符設(shè)備要么不可以隨機(jī)訪問(wèn),例如聲卡如果可以被隨機(jī)訪問(wèn)(往往通過(guò)順序訪問(wèn)方式實(shí)現(xiàn)),但隨著數(shù)
3、據(jù)的位置的不同,其訪問(wèn)時(shí)間會(huì)相差很大,例如磁帶網(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)中的實(shí)際文件索引節(jié)點(diǎn)不對(duì)磁盤(pán)上的數(shù)據(jù)塊編址,而是包含硬件設(shè)備的一個(gè)標(biāo)識(shí)每個(gè)文件設(shè)備包括:名字、類型(字符/塊)設(shè)備
4、號(hào)(主設(shè)備號(hào):次設(shè)備號(hào)),xlanchen@2006.6.22,Embedded Operating Systems,6,,mknod()系統(tǒng)調(diào)用用來(lái)創(chuàng)建老式的設(shè)備文件,設(shè)備文件名,,操作權(quán)限和設(shè)備類型其中設(shè)備類型指定:S_IFCHR或S_IFBLK,,設(shè)備號(hào)16位,主設(shè)備號(hào):次設(shè)備號(hào),,xlanchen@2006.6.22,Embedded Operating Systems,7,,設(shè)備文件通常包含在/dev目錄中一些設(shè)
5、備文件的例子,xlanchen@2006.6.22,Embedded Operating Systems,8,,注意:字符設(shè)備與塊設(shè)備具有獨(dú)立的編號(hào),例如,塊設(shè)備(3,0)不同于字符設(shè)備(3,0)設(shè)備文件通常可以表示一個(gè)硬件設(shè)備,例如磁盤(pán)/dev/hda或硬件設(shè)備的某一物理或邏輯分區(qū),例如磁盤(pán)分區(qū)/dev/hda2或一個(gè)虛擬的邏輯設(shè)備(不會(huì)與任何硬件設(shè)備相關(guān)聯(lián)),例如/dev/null代表一個(gè)“黑洞”,xlanchen@20
6、06.6.22,Embedded Operating Systems,9,,對(duì)內(nèi)核而言,一個(gè)設(shè)備文件的名字是無(wú)關(guān)緊要的,關(guān)鍵在于設(shè)備文件的類型及其主次設(shè)備號(hào)例如,建立一個(gè)設(shè)備文件/tmp/disk,其類型為塊設(shè)備,設(shè)備號(hào)為(3,0),那么內(nèi)核認(rèn)為它與/dev/had等價(jià),xlanchen@2006.6.22,Embedded Operating Systems,10,Devfs設(shè)備文件,使用主次設(shè)備號(hào)標(biāo)識(shí)設(shè)備存在局限性在/dev中的
7、大多數(shù)設(shè)備是不存在的8位長(zhǎng)的主次設(shè)備號(hào)不夠用上述原因以及其他的一些因素綜合起來(lái),促使了devfs設(shè)備文件的產(chǎn)生Devfs虛擬文件系統(tǒng)允許設(shè)備驅(qū)動(dòng)程序通過(guò)名字而不是主次設(shè)備號(hào)注冊(cè)設(shè)備,例如所有的磁盤(pán)可以放在/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ū)動(dòng)程序通過(guò)調(diào)用devfs_register()注冊(cè)設(shè)備一個(gè)注冊(cè)了的設(shè)備文件自動(dòng)出現(xiàn)在devfs的虛擬目錄下,xlanchen@2006.6.22,Embedded Operating Systems,12,設(shè)備文件的VFS處理,進(jìn)程訪問(wèn)普通文件時(shí),通過(guò)文件系統(tǒng)訪問(wèn)磁盤(pán)分區(qū)中的數(shù)據(jù)塊當(dāng)進(jìn)程訪問(wèn)設(shè)備文件時(shí),卻可以驅(qū)動(dòng)硬件設(shè)備例如,進(jìn)程訪問(wèn)計(jì)算機(jī)上的溫度計(jì)對(duì)應(yīng)的設(shè)備文件獲得溫度HOW?VFS,x
9、lanchen@2006.6.22,Embedded Operating Systems,13,VFS,VFS在設(shè)備文件打開(kāi)時(shí)使用與設(shè)備相關(guān)的函數(shù)調(diào)用替換其缺省的文件操作這些設(shè)備相關(guān)函數(shù)調(diào)用對(duì)硬件設(shè)備進(jìn)行操作,xlanchen@2006.6.22,Embedded Operating Systems,14,設(shè)備驅(qū)動(dòng)程序,這是一個(gè)軟件層,使得硬件設(shè)備能夠響應(yīng)預(yù)定義好的編程接口,就是一組控制設(shè)備的VFS函數(shù)接口open,read,lse
10、ek,ioctl等上述函數(shù)的具體實(shí)現(xiàn)由設(shè)備驅(qū)動(dòng)程序提供此外設(shè)備驅(qū)動(dòng)程序必須首先注冊(cè)并初始化自己并在進(jìn)行數(shù)據(jù)傳送的時(shí)候監(jiān)控I/O操作,xlanchen@2006.6.22,Embedded Operating Systems,15,注冊(cè)設(shè)備驅(qū)動(dòng)程序,注冊(cè)一個(gè)設(shè)備驅(qū)動(dòng)程序意味著把它與對(duì)應(yīng)的設(shè)備文件連接起來(lái)使得對(duì)設(shè)備文件發(fā)出的系統(tǒng)調(diào)用可以由內(nèi)核轉(zhuǎn)化為相應(yīng)的設(shè)備驅(qū)動(dòng)程序?qū)?yīng)的函數(shù)訪問(wèn)一個(gè)沒(méi)有注冊(cè)設(shè)備驅(qū)動(dòng)程序的設(shè)備文件將會(huì)返回錯(cuò)誤碼-
11、ENODEV,xlanchen@2006.6.22,Embedded Operating Systems,16,,注冊(cè)時(shí)機(jī)如果設(shè)備驅(qū)動(dòng)程序被靜態(tài)編譯進(jìn)內(nèi)核,則注冊(cè)發(fā)生在內(nèi)核初始化階段如果作為一個(gè)內(nèi)核模塊來(lái)編譯,則在裝入模塊的時(shí)候注冊(cè)(并在卸載模塊時(shí)注銷),xlanchen@2006.6.22,Embedded Operating Systems,17,設(shè)備驅(qū)動(dòng)程序的初始化,對(duì)設(shè)備驅(qū)動(dòng)程序進(jìn)行注冊(cè)與初始化是兩件不同的事情注冊(cè)應(yīng)當(dāng)盡早
12、:使得用戶可以使用設(shè)備文件初始化應(yīng)當(dāng)推遲到最后可能的時(shí)候原因:初始化就意味著需要分配系統(tǒng)中的稀缺資源,例如:1,中斷向量(動(dòng)態(tài)分配的情況下)2,用于DMA傳送的緩沖區(qū)的頁(yè)框3,包括DMA通道本身,xlanchen@2006.6.22,Embedded Operating Systems,18,監(jiān)控I/O操作,I/O操作的持續(xù)時(shí)間通常不可預(yù)知,可能與各種因素相關(guān),例如機(jī)械裝置的狀態(tài),如對(duì)于磁盤(pán)來(lái)講,磁頭的當(dāng)前位置或?qū)嶋H的隨機(jī)
13、事件,例如數(shù)據(jù)包何時(shí)到達(dá)網(wǎng)卡以及人為因素,例如人對(duì)鍵盤(pán)、鼠標(biāo)的使用,以及發(fā)現(xiàn)打印機(jī)卡紙時(shí)的操作為此設(shè)備驅(qū)動(dòng)程序必須通過(guò)某種監(jiān)控手段監(jiān)控I/O操作終止或超時(shí),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控制器能夠通過(guò)IRQ線發(fā)出I/O操作結(jié)束的信號(hào),就可以使用中斷模式,xlanchen@2006.6.22,Embedded Operating Systems,20,輪詢模式的簡(jiǎn)單例子,Why ”--count”也可以使用jiffies進(jìn)行超時(shí)判斷若時(shí)間比較長(zhǎng),比如ms級(jí),可以在每次輪詢操作之后調(diào)用schedule主動(dòng)放棄CPU,直到下次被調(diào)度再次輪詢,可以用來(lái)粗略的判斷超時(shí),xlanchen@2006.6.22,Embe
15、dded Operating Systems,21,中斷模式的簡(jiǎn)單例子,假定實(shí)現(xiàn)一個(gè)簡(jiǎn)單的輸入字符設(shè)備的驅(qū)動(dòng)程序當(dāng)在對(duì)應(yīng)的設(shè)備文件上發(fā)出read()系統(tǒng)調(diào)用時(shí),一條輸入命令被發(fā)往設(shè)備的控制寄存器在一個(gè)不可預(yù)知的長(zhǎng)時(shí)間后,設(shè)備把一個(gè)字節(jié)的數(shù)據(jù)放在輸入寄存器驅(qū)動(dòng)程序然后將這個(gè)字節(jié)作為read()系統(tǒng)調(diào)用的結(jié)果返回,xlanchen@2006.6.22,Embedded Operating Systems,22,,這個(gè)驅(qū)動(dòng)程序包含兩個(gè)函
16、數(shù):實(shí)現(xiàn)文件對(duì)象read方法的foo_read()函數(shù)處理中斷的foo_interrupt()函數(shù),只要用戶讀設(shè)備文件,foo_read()函數(shù)就會(huì)被觸發(fā),,對(duì)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,在這個(gè)數(shù)據(jù)的私有數(shù)據(jù)項(xiàng)中,VFS已經(jīng)將其轉(zhuǎn)換成設(shè)備驅(qū)動(dòng)程序的私有的信息foo_dev_t, 被定義為包含如下信息:一個(gè)信號(hào)量,互斥使用intr作為標(biāo)志0:沒(méi)有發(fā)生/處理中斷1:處理了中斷一個(gè)等待隊(duì)列,用來(lái)給foo_read睡眠一個(gè)數(shù)據(jù)區(qū),長(zhǎng)度為1,用來(lái)存放讀到的數(shù)據(jù),xlanchen@2006
18、.6.22,Embedded Operating Systems,25,,char* buf,用戶提供的存放數(shù)據(jù)的空間Count和ppos都沒(méi)有用到再看看foo_interrupt()中,這是通過(guò)foo一個(gè)全局變量獲得設(shè)備的私有數(shù)據(jù)結(jié)構(gòu)的,這個(gè)數(shù)據(jù)結(jié)構(gòu)與foo_read()中通過(guò)filp中獲得的私有數(shù)據(jù)一致foo_interrupt的輸入?yún)?shù)沒(méi)有得到使用,這是一種很普遍的情況,xlanchen@2006.6.22,Embedded
19、 Operating Systems,26,塊設(shè)備驅(qū)動(dòng)程序,典型的塊設(shè)備驅(qū)動(dòng)程序都有很高的平均訪問(wèn)時(shí)間,例如磁盤(pán)的每次操作都需要幾個(gè)ms,主要是為了定位磁頭,一旦定位后,就可以以穩(wěn)定的高速率傳輸數(shù)據(jù)(幾十MB/秒)定義:相鄰的數(shù)據(jù)指當(dāng)數(shù)據(jù)以相鄰的方式存放在磁表面時(shí),一次單獨(dú)操作就可以訪問(wèn)它們,xlanchen@2006.6.22,Embedded Operating Systems,27,,內(nèi)核對(duì)塊設(shè)備處理程序的支持具有以下特點(diǎn):
20、通過(guò)VFS提供統(tǒng)一接口對(duì)磁盤(pán)數(shù)據(jù)進(jìn)行有效的預(yù)讀為數(shù)據(jù)提供磁盤(pán)高速緩存,xlanchen@2006.6.22,Embedded Operating Systems,28,用于塊設(shè)備文件的缺省的文件操作方法,,xlanchen@2006.6.22,Embedded Operating Systems,29,塊設(shè)備請(qǐng)求及其優(yōu)化,雖然塊設(shè)備驅(qū)動(dòng)程序可以一次傳送一個(gè)單獨(dú)的數(shù)據(jù)塊,但是內(nèi)核并不會(huì)為每個(gè)要訪問(wèn)的數(shù)據(jù)塊都執(zhí)行一次I/O操作內(nèi)核試
21、圖把幾個(gè)塊合并在一起,作為一個(gè)整體來(lái)處理,從而減少磁頭的平均移動(dòng)時(shí)間HOW?,xlanchen@2006.6.22,Embedded Operating Systems,30,,為讀寫(xiě)一個(gè)磁盤(pán)塊的請(qǐng)求生成塊設(shè)備請(qǐng)求但推遲這個(gè)請(qǐng)求執(zhí)行的時(shí)間這是提高塊設(shè)備性能的關(guān)鍵機(jī)制當(dāng)請(qǐng)求發(fā)生時(shí),內(nèi)核檢查是否能通過(guò)稍微擴(kuò)展前一個(gè)一直處于等待狀態(tài)的請(qǐng)求而滿足新的請(qǐng)求,從而減少定位的時(shí)間,提高效率,xlanchen@2006.6.22,Embedd
22、ed Operating Systems,31,,每個(gè)塊設(shè)備驅(qū)動(dòng)程序都維護(hù)著自己的請(qǐng)求隊(duì)列;每個(gè)物理塊設(shè)備應(yīng)當(dāng)有一個(gè)請(qǐng)求隊(duì)列請(qǐng)求可以以提高磁盤(pán)性能的方式進(jìn)行排序低級(jí)的設(shè)備驅(qū)動(dòng)程序一般采用如下策略:處理請(qǐng)求隊(duì)列上的第一個(gè)請(qǐng)求,并設(shè)置設(shè)備控制器,以便在數(shù)據(jù)傳送完成時(shí)可以產(chǎn)生一個(gè)中斷,然后就停止當(dāng)設(shè)備控制器產(chǎn)生中斷時(shí),中斷處理程序就激活下半部分。下半部分將被處理的請(qǐng)求刪除,并繼續(xù)1,xlanchen@2006.6.22,Embed
23、ded Operating Systems,32,驅(qū)動(dòng)程序的編寫(xiě),有專門的書(shū)《Linux設(shè)備驅(qū)動(dòng)程序》來(lái)講如何寫(xiě)Linux下的驅(qū)動(dòng)程序中譯本有500多頁(yè)我們這里用最簡(jiǎn)單的例子來(lái)嘗試驅(qū)動(dòng)程序的編寫(xiě),xlanchen@2006.6.22,Embedded Operating Systems,33,,1,確定設(shè)備名稱與主次設(shè)備號(hào)(動(dòng)態(tài)分配的不指定)2,編寫(xiě)設(shè)備文件對(duì)內(nèi)核上層的接口file_operations包括:init, op
24、en, release, read, write, ioctl等3,編譯并加載設(shè)備驅(qū)動(dòng)(兩種方法)3.1,靜態(tài)加載:3.1.1,將初始化函數(shù)加入內(nèi)核驅(qū)動(dòng)初始化部分3.1.2,修改相應(yīng)的Makefile, 增加驅(qū)動(dòng)的目標(biāo)文件3.1.3,重新編譯內(nèi)核,啟用新的內(nèi)核,xlanchen@2006.6.22,Embedded Operating Systems,34,,3.2,動(dòng)態(tài)加載,先編譯成Linux模塊目標(biāo)文件,再
25、用insmod將驅(qū)動(dòng)模塊加載,還有rmmod, lsmod命令,可查看man得知相應(yīng)的功能。4,在目錄/dev下建立相應(yīng)的設(shè)備文件。mknod 創(chuàng)建設(shè)備對(duì)象,參數(shù): 設(shè)備名 設(shè)備類型 主設(shè)備號(hào) 次設(shè)備號(hào)5,在用戶態(tài)下編寫(xiě)應(yīng)用程序測(cè)試,使用該設(shè)備驅(qū)動(dòng),xlanchen@2006.6.22,Embedded Operating Systems,35,一個(gè)虛擬的字符驅(qū)動(dòng)程序舉例,Char_dev.cMakefileTestchar
26、dev.c設(shè)備名定為:char_dev用命令insmod char_dev.o加載用命令lsmod察看是否成功加載使用dmesg察看主設(shè)備號(hào)使用mknod char_dev c 253 1在/dev目錄下創(chuàng)建設(shè)備文件運(yùn)行Testchardev.c測(cè)試,xlanchen@2006.6.22,Embedded Operating Systems,36,課程回顧,嵌入式操作系統(tǒng)開(kāi)發(fā)Linux內(nèi)核主要模塊分析Linux上的應(yīng)用
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- linux設(shè)備驅(qū)動(dòng)程序
- 通過(guò) windows 驅(qū)動(dòng)程序框架編寫(xiě)驅(qū)動(dòng)程序
- 字符設(shè)備驅(qū)動(dòng)程序的擴(kuò)展操作
- linux字符設(shè)備驅(qū)動(dòng)程序編寫(xiě)基本流程
- 字符設(shè)備驅(qū)動(dòng)程序課程設(shè)計(jì)報(bào)告
- ddk開(kāi)發(fā)pci設(shè)備驅(qū)動(dòng)程序文獻(xiàn)綜述
- macosx平臺(tái)下塊設(shè)備仿真及其驅(qū)動(dòng)程序
- PCI設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)與應(yīng)用.pdf
- 基于ISOS的設(shè)備驅(qū)動(dòng)程序設(shè)計(jì).pdf
- 步進(jìn)電機(jī)驅(qū)動(dòng)程序
- lcd(t)驅(qū)動(dòng)程序
- 硬盤(pán)驅(qū)動(dòng)程序功能簡(jiǎn)介
- dell_驅(qū)動(dòng)程序和
- 嵌入式Linux設(shè)備驅(qū)動(dòng)程序和引導(dǎo)程序的研究.pdf
- Windows98下設(shè)備驅(qū)動(dòng)程序的編寫(xiě).pdf
- Linux設(shè)備驅(qū)動(dòng)程序敏感代碼的檢測(cè)與修復(fù).pdf
- ATM中SP設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn).pdf
- Windows環(huán)境下設(shè)備驅(qū)動(dòng)程序的研究與開(kāi)發(fā).pdf
- linux驅(qū)動(dòng)程序?qū)嶒?yàn)報(bào)告
- μC-OS-Ⅱ內(nèi)核分析及設(shè)備驅(qū)動(dòng)程序模型研究.pdf
評(píng)論
0/150
提交評(píng)論