版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> Linux操作系統(tǒng)U盤驅(qū)動(dòng)設(shè)計(jì)分析報(bào)告</p><p> 學(xué) 院 計(jì)算機(jī)工程學(xué)院</p><p> 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù)</p><p> 年級(jí)班別 09計(jì)算機(jī)科學(xué)與技術(shù)2班</p><p><b> 學(xué) 號(hào) </b></p><p&
2、gt; 學(xué)生姓名 </p><p><b> 指導(dǎo)教師 </b></p><p> 2012年 06 月 14</p><p><b> 目錄</b></p><p> 1.1實(shí)驗(yàn)?zāi)康?</p><p> 1.2實(shí)驗(yàn)環(huán)境1</p&g
3、t;<p> 1.3實(shí)驗(yàn)原理1</p><p> 1.3.1設(shè)備驅(qū)動(dòng)和文件系統(tǒng)的關(guān)系1</p><p> 1.3.2Linux驅(qū)動(dòng)程序的基本原理2</p><p> 1.3.3USB骨架驅(qū)動(dòng)程序2</p><p> 1.4實(shí)驗(yàn)說(shuō)明:6</p><p> 1.4.1驅(qū)動(dòng)過(guò)程
4、6</p><p> 1.4.2U盤驅(qū)動(dòng)配置6</p><p> 1.5實(shí)驗(yàn)過(guò)程:7</p><p> 1.5.1查看內(nèi)核源碼7</p><p> 1.5.2配置與編譯2.6.16版本內(nèi)核7</p><p> 1.5.3獲取、配置目標(biāo)U盤出廠信息8</p><p>
5、; 1.5.4U盤驅(qū)動(dòng)模塊的注冊(cè)與注銷9</p><p> 1.5.5修改Makefile文件10</p><p> 1.5.6Make產(chǎn)生myUSBDriver.ko驅(qū)動(dòng)文件12</p><p> 1.5.7安裝myUSBDriver.ko U盤驅(qū)動(dòng)模塊14</p><p> 1.5.8實(shí)現(xiàn)驅(qū)動(dòng)myUSBDriv
6、er綁定到我們的U盤14</p><p> 1.5.9卸載、注銷myUSBDriver驅(qū)動(dòng)15</p><p> 1.5.10實(shí)現(xiàn)自動(dòng)加載myUSBDriver驅(qū)動(dòng)模塊16</p><p> 1.6實(shí)驗(yàn)總結(jié):17</p><p><b> 實(shí)驗(yàn)?zāi)康?lt;/b></p><p>
7、 實(shí)現(xiàn)在Linux下對(duì)硬件設(shè)備Kingston U盤的驅(qū)動(dòng);</p><p><b> 實(shí)驗(yàn)環(huán)境</b></p><p> Linux 系統(tǒng):Red Hat Enterprise Linux 5</p><p> 內(nèi)核:2.6.18-53.el5(系統(tǒng)內(nèi)核版本)、2.6.16(編寫USB驅(qū)動(dòng)內(nèi)核版本)</p><p&g
8、t;<b> 實(shí)驗(yàn)原理</b></p><p> 設(shè)備驅(qū)動(dòng)和文件系統(tǒng)的關(guān)系</p><p> 圖1顯示了Linux內(nèi)核的體系結(jié)構(gòu), 從圖中可以看出應(yīng)用程序是通過(guò)文件子系統(tǒng)來(lái)訪問(wèn)底層設(shè)備的。一個(gè)物理設(shè)備,在文件系統(tǒng)中對(duì)應(yīng)一個(gè)或多個(gè)邏輯結(jié)點(diǎn), 設(shè)備文件的屬性由三部分信息組成:文件的類型(c/b)、主設(shè)備號(hào)、次設(shè)備號(hào),其中設(shè)備類型和主設(shè)備號(hào)結(jié)合在一起唯一地確定了設(shè)備文
9、件的驅(qū)動(dòng)程序及其界面, 而次設(shè)備號(hào)則說(shuō)明目標(biāo)設(shè)備是同類設(shè)備中的第幾個(gè)。</p><p> Linux驅(qū)動(dòng)程序的基本原理</p><p> Linux下開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序的原理較之Windows系統(tǒng)來(lái)說(shuō)結(jié)構(gòu)簡(jiǎn)單層次清楚。掛在Linux上的每個(gè)設(shè)備都被描述為設(shè)備驅(qū)動(dòng)程序文件, 一些與設(shè)備有關(guān)的設(shè)備參數(shù)文件被保存在/dev目錄下。用戶自己提供或編寫設(shè)備驅(qū)動(dòng)時(shí),也需要在/dev目錄下有一個(gè)設(shè)備文
10、件。設(shè)備驅(qū)動(dòng)程序可以分為三個(gè)主要組成部分:①自動(dòng)配置和初始化子程序;②服務(wù)于I/O請(qǐng)求的子程序;③中斷服務(wù)子程序。骨架關(guān)系如圖2:</p><p><b> USB骨架驅(qū)動(dòng)程序</b></p><p><b> USB驅(qū)動(dòng)的注冊(cè)</b></p><p> Linux USB驅(qū)動(dòng)程序需要做的第一件事情就是在Linux
11、USB子系統(tǒng)里注冊(cè),并提供一些相關(guān)信息,例如這個(gè)驅(qū)動(dòng)程序支持那種設(shè)備。注冊(cè)時(shí)會(huì)通過(guò)初始化函數(shù)發(fā)送一個(gè)命令給usb_register。</p><p> 當(dāng) USB 設(shè)備插入時(shí),為了使 linux_hotplug(Linux 中PCI、USB等設(shè)備熱插拔支持)系統(tǒng)自動(dòng)裝載驅(qū)動(dòng)程序,就需要?jiǎng)?chuàng)建一個(gè)MODULE_DEVICE_TABLE,代碼如下:</p><p> static struc
12、t usb_device_id skel_table [] = { </p><p> { USB_DEVICE(USB_SKEL_VENDOR_ID, </p><p> USB_SKEL_PRODUCT_ID) }, </p><p> { } /* Terminating entry */ </p><p><b>
13、}; </b></p><p> MODULE_DEVICE_TABLE (usb, skel_table);</p><p> USB_DEVICE 宏,利用廠商 ID 和產(chǎn)品 ID 為我們提供了一個(gè)設(shè)備的唯一標(biāo)識(shí)。 當(dāng)系統(tǒng)插入一個(gè)ID 匹配的USB設(shè)備到USB總線時(shí),驅(qū)動(dòng)會(huì)在USB core中注冊(cè),驅(qū)動(dòng)程序中probe 函數(shù)也就會(huì)被調(diào)用。USB_DEVICE 結(jié)構(gòu)指針
14、、接口號(hào)和接口ID都會(huì)被傳遞到函數(shù)中。</p><p> 驅(qū)動(dòng)程序需要確認(rèn)插入的設(shè)備是否可以被接受, 如果不接受,或者在初始化的過(guò)程中發(fā)生任何錯(cuò)誤,probe 函數(shù)返回一個(gè) NULL 值,否則返回一個(gè)含有設(shè)備驅(qū)動(dòng)程序狀態(tài)的指針,通過(guò)這個(gè)指針,就可以訪問(wèn)所有結(jié)構(gòu)中的回調(diào)函數(shù)。 </p><p> 當(dāng)被支持的設(shè)備從系統(tǒng)插入或拔出時(shí),會(huì)有哪些動(dòng)作,所有這些信息都傳送到USB子系統(tǒng)中。在US
15、B骨架程序中可以這樣來(lái)完成:</p><p> static struct usb_driver skel_driver = { </p><p> name: "skeleton", </p><p> probe: skel_probe, </p><p> disconnect:
16、skel_disconnect, </p><p> fops: &skel_fops, </p><p> minor: USB_SKEL_MINOR_BASE, </p><p> id_table: skel_table, </p><p><b> };</b>&l
17、t;/p><p> 變量 name 是一個(gè)字符串,它對(duì)驅(qū)動(dòng)程序進(jìn)行描述;probe和disconnect是函數(shù)指針, 當(dāng)設(shè)備與在id_table中變量信息匹配時(shí),此函數(shù)被調(diào)用;fops和 minor變量是可選的。大多數(shù)USB驅(qū)動(dòng)程序鉤住另外一個(gè)驅(qū)動(dòng)系統(tǒng),例如SCSI、網(wǎng)絡(luò)或 tty 子系統(tǒng)。這些驅(qū)動(dòng)程序在其他驅(qū)動(dòng)系統(tǒng)中注冊(cè),同時(shí)任何用戶空間的交互操作通過(guò)那些接口提供,比如把SCSI設(shè)備驅(qū)動(dòng)作為USB驅(qū)動(dòng)所鉤住的另外
18、一個(gè)驅(qū)動(dòng)系統(tǒng),那么我們對(duì)USB設(shè)備的read、write等操作,就相應(yīng)按SCSI設(shè)備的read、write函數(shù)進(jìn)行訪問(wèn)。</p><p><b> USB驅(qū)動(dòng)的注銷</b></p><p> USB驅(qū)動(dòng)從系統(tǒng)卸載驅(qū)動(dòng)程序時(shí), 需要注銷USB子系統(tǒng),即需要usb_unregister 函數(shù)處理: </p><p> static void_
19、exit usb_skel_exit(void) </p><p> { /* deregister this driver with the USB subsystem */ </p><p> usb_deregister(&skel_driver); } </p><p> module_exit(usb_skel_exit);<
20、/p><p><b> 注冊(cè) devfs</b></p><p> 在骨架驅(qū)動(dòng)程序里,最后一點(diǎn)是要注冊(cè) devfs。創(chuàng)建一個(gè)緩沖區(qū)來(lái)保存那些被發(fā)送給 USB 設(shè)備的數(shù)據(jù)和那些從設(shè)備上接受的數(shù)據(jù),同時(shí)USB urb被初始化,并且在devfs子系統(tǒng)中注冊(cè)設(shè)備, 允許devfs 用戶訪問(wèn)設(shè)備。 注冊(cè)過(guò)程如下:</p><p> /* initial
21、ize the devfs node for this device and register it */ </p><p> sprintf(name, "skel%d", skel->minor); </p><p> skel->devfs = devfs_register </p><p> (usb_devfs_han
22、dle, name, </p><p> DEVFS_FL_DEFAULT, USB_MAJOR, </p><p> USB_SKEL_MINOR_BASE + skel->minor, </p><p> S_IFCHR | S_IRUSR | S_IWUSR | </p><p> S_IRGRP | S_IWGRP |
23、S_IROTH, </p><p> &skel_fops, NULL);</p><p> 如果devfs_register函數(shù)失敗, devfs子系統(tǒng)會(huì)將此情況報(bào)告給用戶。當(dāng)然最后,如果設(shè)備從 USB 總線拔掉,設(shè)備指針會(huì)調(diào)用disconnect函數(shù)。驅(qū)動(dòng)程序就需要清除那些被分配了的所有私有數(shù)據(jù)、 關(guān)閉urbs, 并且從devfs上注銷自己。 </p>&l
24、t;p> devfs_unregister(skel->devfs);</p><p> 現(xiàn)在,skeleton驅(qū)動(dòng)就已經(jīng)和設(shè)備綁定上了,任何用戶態(tài)程序要操作此設(shè)備都可以通過(guò) file_operations 結(jié)構(gòu)所定義的函數(shù)進(jìn)行了。首先,要 open 此設(shè)備,在 open 函數(shù)中MODULE_INC_USE_COUNT 宏是一個(gè)關(guān)鍵,它的作用是起到一個(gè)計(jì)數(shù)的作用,有一個(gè)用戶態(tài)程序打開(kāi)一個(gè)設(shè)備,計(jì)
25、數(shù)器就加1,例如,我們以模塊方式加入一個(gè)驅(qū)動(dòng),若計(jì)數(shù)器不為零,就說(shuō)明仍然有用戶程序在使用此驅(qū)動(dòng),這時(shí)候,不能通過(guò)rmmod命令卸載驅(qū)動(dòng)模塊。</p><p> skel的write、和read函數(shù)</p><p> 它們負(fù)責(zé)響應(yīng)驅(qū)動(dòng)程序的讀寫操作。在skel_write 中,一個(gè)FILL_BULK_URB函數(shù),就完成了urb 系統(tǒng)callbak和skel_write_bulk_call
26、back之間的聯(lián)系。</p><p> skel_read函數(shù)并沒(méi)有用urb將數(shù)據(jù)從設(shè)備傳送到驅(qū)動(dòng)程序, 而是用usb_bulk_msg函數(shù)代替, 它可以在沒(méi)有創(chuàng)建urbs和urb函數(shù)的情況下,來(lái)發(fā)送和接收數(shù)據(jù)。在此個(gè)過(guò)程中,調(diào)用 usb_bulk_msg 函數(shù)并傳遞一個(gè)存儲(chǔ)空間,用來(lái)緩沖和放置驅(qū)動(dòng)收到的數(shù)據(jù),若沒(méi)有收到數(shù)據(jù),則失敗并返回一個(gè)錯(cuò)誤信息。</p><p> usb_bul
27、k_msg函數(shù)</p><p> 當(dāng)對(duì)usb設(shè)備進(jìn)行一次讀或者寫時(shí), usb_bulk_msg函數(shù)是非常有用的;但是,需要連續(xù)地對(duì)設(shè)備進(jìn)行讀/寫時(shí),就應(yīng)該建立一個(gè)自己的urbs,同 時(shí)將urbs提交給usb子系統(tǒng)。</p><p><b> 實(shí)驗(yàn)說(shuō)明:</b></p><p><b> 驅(qū)動(dòng)過(guò)程</b></p&
28、gt;<p> 對(duì)于一個(gè)硬件,Linux是這樣來(lái)進(jìn)行驅(qū)動(dòng)的:首先,我們必須提供一個(gè).o的驅(qū)動(dòng)模塊文件(這里我們只說(shuō)明模塊方式,其實(shí)內(nèi)核方式是類似的)。我們要使用這個(gè)驅(qū)動(dòng)程序,首先要加載運(yùn)行它(insmod *.o)。這樣驅(qū)動(dòng)就會(huì)根據(jù)自己的類型(字符設(shè)備類型或塊設(shè)備類型,例如鼠標(biāo)就是字符設(shè)備而硬盤就是塊設(shè)備)向系統(tǒng)注冊(cè),注冊(cè)成功系統(tǒng)會(huì)反饋一個(gè)主設(shè)備號(hào),這個(gè)主設(shè)備號(hào)就是系統(tǒng)對(duì)它的唯一標(biāo)識(shí)(例如硬盤塊設(shè)備在/proc/devi
29、ces中顯示的主設(shè)備號(hào)為3 ,我們用ls -l /dev/had看到的主設(shè)備就肯定是3)。驅(qū)動(dòng)就是根據(jù)此主設(shè)備號(hào)來(lái)創(chuàng)建一個(gè)一般放置在/dev目錄下的設(shè)備文件(mknod命令用來(lái)創(chuàng)建它,它必須用主設(shè)備號(hào)這個(gè)參數(shù))。在我們要訪問(wèn)此硬件時(shí),就可以對(duì)設(shè)備文件通過(guò)open、read、write等命令進(jìn)行。而驅(qū)動(dòng)就會(huì)接收到相應(yīng)的read、write操作而根據(jù)自己的模塊中的相應(yīng)函數(shù)進(jìn)行了。</p><p><b>
30、 U盤驅(qū)動(dòng)配置</b></p><p> 在Linux下這些設(shè)備通常都是以一種叫做usb-storage的方式進(jìn)行驅(qū)動(dòng),要使用他們必須加載此模塊usb-storage。本次驅(qū)動(dòng)開(kāi)發(fā)也就是在2.6.16內(nèi)核目錄/drivers/usb/storage下修改相應(yīng)的文件信息,進(jìn)行驅(qū)動(dòng)的開(kāi)發(fā)(/drivers/usb/storage目錄對(duì)應(yīng)為U盤SISC設(shè)備驅(qū)動(dòng)源文件),這樣就可以產(chǎn)生類似于usb-stor
31、age的驅(qū)動(dòng)文件,即為我們需要的目標(biāo)文件。</p><p> 在加載安裝類似于usb-storage的驅(qū)動(dòng)文的時(shí)候,usbcore.o 和usb-uhci.o或usb-ohci也肯定是必須加載安裝的(但一般系統(tǒng)會(huì)自動(dòng)進(jìn)行安裝)。另外,若你系統(tǒng)中SCSI支持也是模塊方式,那么scsi_mod模塊和sd_mod模塊也要加載安裝。</p><p> 在加載完這些模塊后,我們插入U(xiǎn)盤或存儲(chǔ)卡,
32、就會(huì)發(fā)現(xiàn)系統(tǒng)中多了一個(gè)SCSI硬盤,通過(guò)正確地mount它,就可以使用了。mount /dev/你的U盤設(shè)備文件名 /目標(biāo)掛載目錄</p><p><b> 實(shí)驗(yàn)過(guò)程:</b></p><p><b> 查看內(nèi)核源碼</b></p><p> 查看系統(tǒng)目錄/usr/src/kernels,看在這目錄下是否有2.6.x
33、 的內(nèi)核版本源碼,并且確保內(nèi)核源碼的完整性。如果這個(gè)目錄下沒(méi)有相應(yīng)的內(nèi)核源碼,那可以到網(wǎng)上下載等同于系統(tǒng)版本或低于系統(tǒng)版本的源碼,如果該目錄下有系統(tǒng)源碼,那么可以跳過(guò)以下對(duì)下載來(lái)的內(nèi)核源碼的配置及編譯。本次的Linux系統(tǒng)安裝時(shí)在該目錄下產(chǎn)生的源碼并不完整,因此本次用2.6.16版本的內(nèi)核做USB驅(qū)動(dòng)開(kāi)發(fā)。</p><p> 配置與編譯2.6.16版本內(nèi)核</p><p> 進(jìn)入2.6
34、.16內(nèi)核版本目錄,將系統(tǒng)源碼/usr/src/kernels/ 2.6.18-53.el5-i686目錄下的隱藏文件.config拷貝到此目錄,隱藏文件.config為硬件配置與系統(tǒng)設(shè)置文件,是安裝系統(tǒng)時(shí)根據(jù)用戶的配置信息自動(dòng)生成的,為了方便本次開(kāi)發(fā),直接拷貝到此目錄。也可以在內(nèi)核根目錄下執(zhí)行:make menuconfig(基于文本模式的菜單型配置)進(jìn)行相應(yīng)的內(nèi)核配置。</p><p> 在內(nèi)核根目錄下執(zhí)行
35、:make bzImage,實(shí)現(xiàn)對(duì)整個(gè)內(nèi)核重新編譯,這個(gè)過(guò)程可能要持續(xù)一個(gè)小時(shí)左右。執(zhí)行結(jié)束后,可以看到在當(dāng)前目錄下生成了一個(gè)新的文件: vmlinux, 其屬性為-rwxr-xr-x。</p><p> 這樣就完成了對(duì)2.6.16版本內(nèi)核的配置與編譯,下面在此版本內(nèi)核中實(shí)現(xiàn)對(duì)U盤驅(qū)動(dòng)的開(kāi)發(fā)。</p><p> 獲取、配置目標(biāo)U盤出廠信息</p><p> 將
36、Kingston U盤設(shè)備插到主機(jī)上,通過(guò)cat /proc/bus/usb/devices得到當(dāng)前系統(tǒng)探測(cè)到的USB總線上的U盤的信息。它包括Vendor、ProdID、Product等。如圖3所示:</p><p><b> 圖3 U盤出廠信息</b></p><p> 得到Vendor=0951 ProdID=1624和Manufacturer=Kingst
37、on ,Product= DataTraveler G2。</p><p> 進(jìn)入linux-2.6.16內(nèi)核目錄,打開(kāi)drivers/usb/storage/ unusual_devs.h文件,可以看到所有已知的產(chǎn)品登記表,都是以UNUSUAL_DEV(idVendor,idProduct,bcdDeviceMin,bcdDeviceMax,vendor_name,product_name,use_proto
38、col,use_transport,init_function,Flags)方式登記的。只要填入U(xiǎn)盤的信息注冊(cè),就可以讓驅(qū)動(dòng)去認(rèn)識(shí)和發(fā)現(xiàn)它。為了實(shí)現(xiàn)我們的U盤驅(qū)動(dòng),添加如下代碼:</p><p> UNUSUAL_DEV( 0x0951, 0x1624, 0x0001, 0xffff,</p><p> "Kingston",</p><p>
39、; "DataTraveler G2",</p><p> US_SC_SCSI, US_PR_BULK, NULL, </p><p> US_FL_FIX_INQUIRY),</p><p> U盤驅(qū)動(dòng)模塊的注冊(cè)與注銷</p><p> 打開(kāi)drivers/usb/storage/ usb.c文件,可以看到該
40、文件完成了對(duì)U盤設(shè)備的注冊(cè)、注銷等一系列的功能。修改如下代碼:</p><p> //將U盤驅(qū)動(dòng)的名稱改為:myUSBDriver</p><p> static struct usb_driver usb_storage_driver = {</p><p> .name ="myUSBDriver",</p><
41、p> .probe =storage_probe, </p><p> .disconnect =storage_disconnect,</p><p> #ifdef CONFIG_PM</p><p> .suspend =storage_suspend,</p><p> .resume =storage_res
42、ume,</p><p><b> #endif</b></p><p> .id_table =storage_usb_ids,</p><p><b> };</b></p><p> //修改注冊(cè)函數(shù),讓注冊(cè)驅(qū)動(dòng)時(shí),在/var/log/message中輸出:myUSBDriver I
43、nitializing 2011-6-15</p><p> static int __init usb_stor_init(void)</p><p><b> {</b></p><p><b> ……</b></p><p> printk(KERN_INFO " myUSB
44、Driver Initializing 2011-6-15</p><p><b> ”);</b></p><p><b> ……</b></p><p> return retval;</p><p><b> }</b></p><p>
45、 //修改注銷函數(shù),注銷驅(qū)動(dòng)時(shí)輸出:myUSBDriver removing 2011-6-15</p><p> static void __exit usb_stor_exit(void)</p><p><b> {</b></p><p><b> ……</b></p><p>
46、printk(KERN_INFO " myUSBDriver removing 2011-6-15”);</p><p><b> ……</b></p><p><b> }</b></p><p> 修改Makefile文件</p><p> 為了單獨(dú)編譯U盤驅(qū)動(dòng)模塊(與內(nèi)核編
47、譯脫離開(kāi)來(lái),有利于節(jié)省編譯時(shí)間),修改drivers/usb/storage目錄下的Makefile文件為:</p><p> /***********************************************************/</p><p> EXTRA_CFLAGS:= -Idrivers/scsi</p><p> ifneq
48、($(KERNELRELEASE),)</p><p> obj-$(CONFIG_USB_STORAGE)+= myUSBDriver.o</p><p> myUSBDriver-obj-$(CONFIG_USB_STORAGE_DEBUG)+= debug.o</p><p> myUSBDriver-obj-$(CONFIG_USB_STORAGE
49、_USBAT)+= shuttle_usbat.o</p><p> myUSBDriver-obj-$(CONFIG_USB_STORAGE_SDDR09)+= sddr09.o</p><p> myUSBDriver-obj-$(CONFIG_USB_STORAGE_SDDR55)+= sddr55.o</p><p> myUSBDriver-o
50、bj-$(CONFIG_USB_STORAGE_FREECOM)+= freecom.o</p><p> myUSBDriver-obj-$(CONFIG_USB_STORAGE_DPCM)+= dpcm.o</p><p> myUSBDriver-obj-$(CONFIG_USB_STORAGE_ISD200)+= isd200.o</p><p>
51、 myUSBDriver-obj-$(CONFIG_USB_STORAGE_DATAFAB)+= datafab.o</p><p> myUSBDriver-obj-$(CONFIG_USB_STORAGE_JUMPSHOT)+= jumpshot.o</p><p> myUSBDriver-obj-$(CONFIG_USB_STORAGE_ALAUDA)+= alauda
52、.o</p><p> myUSBDriver-obj-$(CONFIG_USB_STORAGE_ONETOUCH)+= onetouch.o</p><p> myUSBDriver-objs :=scsiglue.o protocol.o transport.o usb.o \</p><p> initializers.o $(myUSBDriver
53、-obj-y)</p><p><b> else</b></p><p> PWD := $(shell pwd)</p><p> KVER ?= $(shell uname -r)</p><p> KDIR := /lib/modules/$(KVER)/build</p><p>
54、;<b> all:</b></p><p> $(MAKE) -C $(KDIR) M=$(PWD)</p><p><b> endif </b></p><p> ifneq ($(CONFIG_USB_LIBUSUAL),)</p><p> obj-$(CONFIG_USB)+
55、= libusual.o</p><p><b> endif</b></p><p><b> clean:</b></p><p> rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions</p><p> /**********************
56、*************************************/</p><p> 執(zhí)行該Makefile文件,將會(huì)產(chǎn)生myUSBDriver.ko的U盤驅(qū)動(dòng)文件。</p><p> Make產(chǎn)生myUSBDriver.ko驅(qū)動(dòng)文件</p><p> 在drivers/usb/storage目錄下(也可以將storage文件夾拷貝到別的地方)執(zhí)行命
57、令:make,如下所示:</p><p> 最后產(chǎn)生了myUSBDriver.ko驅(qū)動(dòng)文件,如下所示:</p><p> 卸掉原來(lái)系統(tǒng)中U盤驅(qū)動(dòng):usb-storage.ko</p><p> 在/lib/modules/2.6.18-53.el5/kernel/drivers/usb/storage/目錄下,將已存在的文件usb-storage.ko修改為u
58、sb-storage,因?yàn)樵撃夸浵碌挠布?qū)動(dòng)存在依賴關(guān)系,即使U盤驅(qū)動(dòng)沒(méi)有安裝,當(dāng)插入U(xiǎn)盤時(shí),該目錄下的.ko驅(qū)動(dòng)文件會(huì)自動(dòng)進(jìn)行安裝,這樣修改是為了避免自動(dòng)安裝U盤驅(qū)動(dòng),以便調(diào)試我們編寫的U盤驅(qū)動(dòng)。執(zhí)行如下:</p><p> 插入U(xiǎn)盤,執(zhí)行命令:cat /proc/bus/usb/devices,但是依然會(huì)發(fā)現(xiàn)我們的U盤乃然使用usb-storage驅(qū)動(dòng)。如下所示</p><p>
59、拔出U盤,執(zhí)行命令:rmmod usb-storage,執(zhí)行對(duì)usb-storage模塊驅(qū)動(dòng)的卸載,執(zhí)行如下所示,由命令:lsmod可知系統(tǒng)中已經(jīng)沒(méi)有了usb-storage驅(qū)動(dòng)模塊。</p><p> 插入U(xiǎn)盤,這時(shí)會(huì)發(fā)現(xiàn)U盤沒(méi)有使用任何驅(qū)動(dòng)程序,如下所示</p><p> 這樣就完成了對(duì)原來(lái)系統(tǒng)中U盤驅(qū)動(dòng)usb-storage.ko的卸載。</p><p>
60、 安裝myUSBDriver.ko U盤驅(qū)動(dòng)模塊</p><p> 在storage目錄中執(zhí)行命令:insmod myUSBDriver.ko,這樣就完成了對(duì)我們U盤驅(qū)動(dòng)模塊的安裝,如下所示:</p><p> 執(zhí)行命令:cat /var/log/messge 查看日志文件,如果輸出我們的注冊(cè)信息:myUSBDriver Initializing 2011-6-15,則表示我們的驅(qū)
61、動(dòng)安裝成功,如下所示:</p><p> 可知,我們的U盤驅(qū)動(dòng)已成功注冊(cè)安裝!</p><p> 也可執(zhí)行命令:lsmod查看已安裝的模塊驅(qū)動(dòng),如下所示:</p><p> 實(shí)現(xiàn)驅(qū)動(dòng)myUSBDriver綁定到我們的U盤</p><p> 把我們的U盤插入到主機(jī)中,執(zhí)行命令:cat /proc/bus/usb/devices,可以查看
62、U盤使用的驅(qū)動(dòng),如下所示:</p><p> 可見(jiàn)我們的驅(qū)動(dòng)已經(jīng)和我們的U盤綁定在一起了。執(zhí)行命令:cat /var/log/messge 查看日志文件,如下所示:</p><p> 可見(jiàn)在/dev/下生成設(shè)備文件sdb4,現(xiàn)在就可以對(duì)這個(gè)設(shè)備文件進(jìn)行掛載,并且打開(kāi)、讀寫、關(guān)閉等的操作了。</p><p> 執(zhí)行命令:ls –la /dev/sdb4,如下&l
63、t;/p><p> 可見(jiàn),邏輯設(shè)備節(jié)點(diǎn)sdb4為塊類型的設(shè)備文件,對(duì)應(yīng)于我們的U盤,該設(shè)備文件的主設(shè)備號(hào)為:8,次設(shè)備號(hào)為:20,我們可以對(duì)塊設(shè)備文件進(jìn)行直接存取操作。</p><p> 同樣在窗體界面操作時(shí),我們會(huì)發(fā)現(xiàn)在計(jì)算機(jī)中存在了我們的U盤SCSI 設(shè)備,如下所示:</p><p> 我們可以在窗體界面下直接對(duì)我們的U盤進(jìn)行訪問(wèn)。</p>&l
64、t;p> 這樣我們的U盤驅(qū)動(dòng)程序的編寫就實(shí)現(xiàn)了。</p><p> 卸載、注銷myUSBDriver驅(qū)動(dòng)</p><p> 執(zhí)行命令:rmmmod myUSBDriver 對(duì)驅(qū)動(dòng)myUSBDriver進(jìn)行卸載(當(dāng)U盤在使用該驅(qū)動(dòng)時(shí),無(wú)法卸載),如下所示:</p><p> 執(zhí)行命令:cat /var/log/messge 查看日志文件,如下:</
65、p><p> 可見(jiàn),在日志文件中輸出:myUSBDriver removing 2011-6-15,即為我們修改的注銷函數(shù)輸出信息,這樣更進(jìn)一步表明了我們驅(qū)動(dòng)開(kāi)發(fā)的正確性。</p><p> 執(zhí)行命令:lsmod可以查看到已經(jīng)沒(méi)有了myUSBDriver驅(qū)動(dòng)!</p><p> 實(shí)現(xiàn)自動(dòng)加載myUSBDriver驅(qū)動(dòng)模塊</p><p>
66、 為了實(shí)現(xiàn)當(dāng)插上U盤時(shí)可以自動(dòng)加載安裝myUSBDriver驅(qū)動(dòng)模塊,可以把myUSBDriver驅(qū)動(dòng)模塊拷貝到/lib/modules/ 2.6.18-53.el5/ kernel/drivers/usb/storage/目錄下,然后在該目錄下depmod一下(depmod用于分析可載入模塊的相依性,depmod可檢測(cè)模塊的相依性,供modprobe在安裝模塊時(shí)使用)(modprobe與insmod的區(qū)別:modprobe主要加載系統(tǒng)
67、已經(jīng)通過(guò)depmod登記過(guò)的模塊,insmod一般是針對(duì)具體.o文件進(jìn)行加載),那么你在插入U(xiǎn)SB設(shè)備的時(shí)候,系統(tǒng)就會(huì)自動(dòng)為你加載驅(qū)動(dòng)模塊的,當(dāng)然這個(gè)得有hotplug(熱插拔的掛載機(jī)制)的支持。自動(dòng)掛載磁盤分區(qū)的操作從底層來(lái)說(shuō),是要內(nèi)核支持的,2.6 內(nèi)核的sysfs 虛擬文件系統(tǒng)就提供了這一支持,這個(gè)文件系統(tǒng) (/sys/) 通常用于反應(yīng)系統(tǒng)硬件信息,總線上的設(shè)備變化、網(wǎng)絡(luò)設(shè)備的變化等事件在這里都能反應(yīng)出來(lái),這個(gè)文件系統(tǒng)的變化配合上
68、內(nèi)核的 hotplug 機(jī)制就可以掌握硬件改動(dòng)相關(guān)的信息。如下所示:</p><p> 確保系統(tǒng)沒(méi)有安裝加載myUSBDriver驅(qū)動(dòng)模塊后,插入我們的U盤,這時(shí)在計(jì)算機(jī)中會(huì)發(fā)現(xiàn)我們的U盤的SCSI 設(shè)備,執(zhí)行命令:cat /proc/bus/usb/devices,如下:</p><p> 可以發(fā)現(xiàn),系統(tǒng)已經(jīng)為我們自動(dòng)加載了myUSBDriver驅(qū)動(dòng),這樣就方便了我們重啟電腦后的一系
69、列驅(qū)動(dòng)加載安裝的麻煩。同樣可以執(zhí)行cat /var/log/message查看相關(guān)的日志信息。</p><p> 這樣就完成了我們需要的自動(dòng)加載myUSBDriver驅(qū)動(dòng)模塊!</p><p><b> 實(shí)驗(yàn)總結(jié):</b></p><p> 本次課程設(shè)計(jì),已經(jīng)完全達(dá)到了開(kāi)發(fā)U盤驅(qū)動(dòng)的需求,也為開(kāi)發(fā)別的硬件的U盤提供了在Linux系統(tǒng)下開(kāi)發(fā)
70、的參考,更為開(kāi)發(fā)別的USB設(shè)備提供了思路。通過(guò)本次課程設(shè)計(jì),使我們對(duì)Linux內(nèi)核有了更深的了解,進(jìn)一步為內(nèi)核的移植打下了基礎(chǔ),同時(shí)在這過(guò)程中也讓我們體會(huì)到了Linux系統(tǒng)源代碼開(kāi)放的極大好處與帶來(lái)的樂(lè)趣。Linux值得去學(xué),值得去深入了解探討,對(duì)于本次實(shí)驗(yàn),我對(duì)Linux又有了深層次的理解與體會(huì),對(duì)于項(xiàng)目開(kāi)發(fā)有了一定的經(jīng)驗(yàn),但是同時(shí),要真正把linux用于實(shí)踐中我們還要付出更大的努力,雖然現(xiàn)在有關(guān)嵌入式linux開(kāi)發(fā)的資料一大把,但要
溫馨提示
- 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è)計(jì)報(bào)告--linux操作系統(tǒng)應(yīng)用
- linux操作系統(tǒng)課程設(shè)計(jì)
- linux操作系統(tǒng)基礎(chǔ)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--linux二級(jí)文件系統(tǒng)設(shè)計(jì)
- linux操作系統(tǒng)應(yīng)用課程整體設(shè)計(jì)
- linux操作系統(tǒng)課程整體教學(xué)設(shè)計(jì)
- linux操作系統(tǒng)應(yīng)用課程整體設(shè)計(jì)
- 課程設(shè)計(jì)---操作系統(tǒng)課程設(shè)計(jì)之linux磁盤空間管理
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告-linux頁(yè)面換入換出分析、進(jìn)程管理器
- 操作系統(tǒng)課程設(shè)計(jì)linux二級(jí)文件系統(tǒng)設(shè)計(jì)
- linux操作系統(tǒng)課程設(shè)計(jì)--頁(yè)面置換算法模擬
- linux字符設(shè)備驅(qū)動(dòng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--驅(qū)動(dòng)調(diào)度
- 課程設(shè)計(jì)--linux操作系統(tǒng)安全性的研究
- linux操作系統(tǒng)驅(qū)動(dòng)框架附驅(qū)動(dòng)加載
- 《linux操作系統(tǒng)》課程標(biāo)準(zhǔn)
- linux操作系統(tǒng)課程論文模板
- linux課程設(shè)計(jì)報(bào)告
- 2011180012linux操作系統(tǒng)課程設(shè)計(jì)報(bào)告web服務(wù)器的實(shí)現(xiàn)
- 2011180012linux操作系統(tǒng)課程設(shè)計(jì)報(bào)告web服務(wù)器的實(shí)現(xiàn)
評(píng)論
0/150
提交評(píng)論