版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> Linux操作系統(tǒng)U盤驅(qū)動設(shè)計分析報告</p><p> 學 院 計算機工程學院</p><p> 專 業(yè) 計算機科學與技術(shù)</p><p> 年級班別 09計算機科學與技術(shù)2班</p><p><b> 學 號 </b></p><p&
2、gt; 學生姓名 </p><p><b> 指導教師 </b></p><p> 2012年 06 月 14</p><p><b> 目錄</b></p><p> 1.1實驗目的1</p><p> 1.2實驗環(huán)境1</p&g
3、t;<p> 1.3實驗原理1</p><p> 1.3.1設(shè)備驅(qū)動和文件系統(tǒng)的關(guān)系1</p><p> 1.3.2Linux驅(qū)動程序的基本原理2</p><p> 1.3.3USB骨架驅(qū)動程序2</p><p> 1.4實驗說明:6</p><p> 1.4.1驅(qū)動過程
4、6</p><p> 1.4.2U盤驅(qū)動配置6</p><p> 1.5實驗過程: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獲取、配置目標U盤出廠信息8</p><p>
5、; 1.5.4U盤驅(qū)動模塊的注冊與注銷9</p><p> 1.5.5修改Makefile文件10</p><p> 1.5.6Make產(chǎn)生myUSBDriver.ko驅(qū)動文件12</p><p> 1.5.7安裝myUSBDriver.ko U盤驅(qū)動模塊14</p><p> 1.5.8實現(xiàn)驅(qū)動myUSBDriv
6、er綁定到我們的U盤14</p><p> 1.5.9卸載、注銷myUSBDriver驅(qū)動15</p><p> 1.5.10實現(xiàn)自動加載myUSBDriver驅(qū)動模塊16</p><p> 1.6實驗總結(jié):17</p><p><b> 實驗目的</b></p><p>
7、 實現(xiàn)在Linux下對硬件設(shè)備Kingston U盤的驅(qū)動;</p><p><b> 實驗環(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ū)動內(nèi)核版本)</p><p&g
8、t;<b> 實驗原理</b></p><p> 設(shè)備驅(qū)動和文件系統(tǒng)的關(guān)系</p><p> 圖1顯示了Linux內(nèi)核的體系結(jié)構(gòu), 從圖中可以看出應用程序是通過文件子系統(tǒng)來訪問底層設(shè)備的。一個物理設(shè)備,在文件系統(tǒng)中對應一個或多個邏輯結(jié)點, 設(shè)備文件的屬性由三部分信息組成:文件的類型(c/b)、主設(shè)備號、次設(shè)備號,其中設(shè)備類型和主設(shè)備號結(jié)合在一起唯一地確定了設(shè)備文
9、件的驅(qū)動程序及其界面, 而次設(shè)備號則說明目標設(shè)備是同類設(shè)備中的第幾個。</p><p> Linux驅(qū)動程序的基本原理</p><p> Linux下開發(fā)設(shè)備驅(qū)動程序的原理較之Windows系統(tǒng)來說結(jié)構(gòu)簡單層次清楚。掛在Linux上的每個設(shè)備都被描述為設(shè)備驅(qū)動程序文件, 一些與設(shè)備有關(guān)的設(shè)備參數(shù)文件被保存在/dev目錄下。用戶自己提供或編寫設(shè)備驅(qū)動時,也需要在/dev目錄下有一個設(shè)備文
10、件。設(shè)備驅(qū)動程序可以分為三個主要組成部分:①自動配置和初始化子程序;②服務于I/O請求的子程序;③中斷服務子程序。骨架關(guān)系如圖2:</p><p><b> USB骨架驅(qū)動程序</b></p><p><b> USB驅(qū)動的注冊</b></p><p> Linux USB驅(qū)動程序需要做的第一件事情就是在Linux
11、USB子系統(tǒng)里注冊,并提供一些相關(guān)信息,例如這個驅(qū)動程序支持那種設(shè)備。注冊時會通過初始化函數(shù)發(fā)送一個命令給usb_register。</p><p> 當 USB 設(shè)備插入時,為了使 linux_hotplug(Linux 中PCI、USB等設(shè)備熱插拔支持)系統(tǒng)自動裝載驅(qū)動程序,就需要創(chuàng)建一個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 為我們提供了一個設(shè)備的唯一標識。 當系統(tǒng)插入一個ID 匹配的USB設(shè)備到USB總線時,驅(qū)動會在USB core中注冊,驅(qū)動程序中probe 函數(shù)也就會被調(diào)用。USB_DEVICE 結(jié)構(gòu)指針
14、、接口號和接口ID都會被傳遞到函數(shù)中。</p><p> 驅(qū)動程序需要確認插入的設(shè)備是否可以被接受, 如果不接受,或者在初始化的過程中發(fā)生任何錯誤,probe 函數(shù)返回一個 NULL 值,否則返回一個含有設(shè)備驅(qū)動程序狀態(tài)的指針,通過這個指針,就可以訪問所有結(jié)構(gòu)中的回調(diào)函數(shù)。 </p><p> 當被支持的設(shè)備從系統(tǒng)插入或拔出時,會有哪些動作,所有這些信息都傳送到USB子系統(tǒng)中。在US
15、B骨架程序中可以這樣來完成:</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 是一個字符串,它對驅(qū)動程序進行描述;probe和disconnect是函數(shù)指針, 當設(shè)備與在id_table中變量信息匹配時,此函數(shù)被調(diào)用;fops和 minor變量是可選的。大多數(shù)USB驅(qū)動程序鉤住另外一個驅(qū)動系統(tǒng),例如SCSI、網(wǎng)絡(luò)或 tty 子系統(tǒng)。這些驅(qū)動程序在其他驅(qū)動系統(tǒng)中注冊,同時任何用戶空間的交互操作通過那些接口提供,比如把SCSI設(shè)備驅(qū)動作為USB驅(qū)動所鉤住的另外
18、一個驅(qū)動系統(tǒng),那么我們對USB設(shè)備的read、write等操作,就相應按SCSI設(shè)備的read、write函數(shù)進行訪問。</p><p><b> USB驅(qū)動的注銷</b></p><p> USB驅(qū)動從系統(tǒng)卸載驅(qū)動程序時, 需要注銷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> 注冊 devfs</b></p><p> 在骨架驅(qū)動程序里,最后一點是要注冊 devfs。創(chuàng)建一個緩沖區(qū)來保存那些被發(fā)送給 USB 設(shè)備的數(shù)據(jù)和那些從設(shè)備上接受的數(shù)據(jù),同時USB urb被初始化,并且在devfs子系統(tǒng)中注冊設(shè)備, 允許devfs 用戶訪問設(shè)備。 注冊過程如下:</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)會將此情況報告給用戶。當然最后,如果設(shè)備從 USB 總線拔掉,設(shè)備指針會調(diào)用disconnect函數(shù)。驅(qū)動程序就需要清除那些被分配了的所有私有數(shù)據(jù)、 關(guān)閉urbs, 并且從devfs上注銷自己。 </p>&l
24、t;p> devfs_unregister(skel->devfs);</p><p> 現(xiàn)在,skeleton驅(qū)動就已經(jīng)和設(shè)備綁定上了,任何用戶態(tài)程序要操作此設(shè)備都可以通過 file_operations 結(jié)構(gòu)所定義的函數(shù)進行了。首先,要 open 此設(shè)備,在 open 函數(shù)中MODULE_INC_USE_COUNT 宏是一個關(guān)鍵,它的作用是起到一個計數(shù)的作用,有一個用戶態(tài)程序打開一個設(shè)備,計
25、數(shù)器就加1,例如,我們以模塊方式加入一個驅(qū)動,若計數(shù)器不為零,就說明仍然有用戶程序在使用此驅(qū)動,這時候,不能通過rmmod命令卸載驅(qū)動模塊。</p><p> skel的write、和read函數(shù)</p><p> 它們負責響應驅(qū)動程序的讀寫操作。在skel_write 中,一個FILL_BULK_URB函數(shù),就完成了urb 系統(tǒng)callbak和skel_write_bulk_call
26、back之間的聯(lián)系。</p><p> skel_read函數(shù)并沒有用urb將數(shù)據(jù)從設(shè)備傳送到驅(qū)動程序, 而是用usb_bulk_msg函數(shù)代替, 它可以在沒有創(chuàng)建urbs和urb函數(shù)的情況下,來發(fā)送和接收數(shù)據(jù)。在此個過程中,調(diào)用 usb_bulk_msg 函數(shù)并傳遞一個存儲空間,用來緩沖和放置驅(qū)動收到的數(shù)據(jù),若沒有收到數(shù)據(jù),則失敗并返回一個錯誤信息。</p><p> usb_bul
27、k_msg函數(shù)</p><p> 當對usb設(shè)備進行一次讀或者寫時, usb_bulk_msg函數(shù)是非常有用的;但是,需要連續(xù)地對設(shè)備進行讀/寫時,就應該建立一個自己的urbs,同 時將urbs提交給usb子系統(tǒng)。</p><p><b> 實驗說明:</b></p><p><b> 驅(qū)動過程</b></p&
28、gt;<p> 對于一個硬件,Linux是這樣來進行驅(qū)動的:首先,我們必須提供一個.o的驅(qū)動模塊文件(這里我們只說明模塊方式,其實內(nèi)核方式是類似的)。我們要使用這個驅(qū)動程序,首先要加載運行它(insmod *.o)。這樣驅(qū)動就會根據(jù)自己的類型(字符設(shè)備類型或塊設(shè)備類型,例如鼠標就是字符設(shè)備而硬盤就是塊設(shè)備)向系統(tǒng)注冊,注冊成功系統(tǒng)會反饋一個主設(shè)備號,這個主設(shè)備號就是系統(tǒng)對它的唯一標識(例如硬盤塊設(shè)備在/proc/devi
29、ces中顯示的主設(shè)備號為3 ,我們用ls -l /dev/had看到的主設(shè)備就肯定是3)。驅(qū)動就是根據(jù)此主設(shè)備號來創(chuàng)建一個一般放置在/dev目錄下的設(shè)備文件(mknod命令用來創(chuàng)建它,它必須用主設(shè)備號這個參數(shù))。在我們要訪問此硬件時,就可以對設(shè)備文件通過open、read、write等命令進行。而驅(qū)動就會接收到相應的read、write操作而根據(jù)自己的模塊中的相應函數(shù)進行了。</p><p><b>
30、 U盤驅(qū)動配置</b></p><p> 在Linux下這些設(shè)備通常都是以一種叫做usb-storage的方式進行驅(qū)動,要使用他們必須加載此模塊usb-storage。本次驅(qū)動開發(fā)也就是在2.6.16內(nèi)核目錄/drivers/usb/storage下修改相應的文件信息,進行驅(qū)動的開發(fā)(/drivers/usb/storage目錄對應為U盤SISC設(shè)備驅(qū)動源文件),這樣就可以產(chǎn)生類似于usb-stor
31、age的驅(qū)動文件,即為我們需要的目標文件。</p><p> 在加載安裝類似于usb-storage的驅(qū)動文的時候,usbcore.o 和usb-uhci.o或usb-ohci也肯定是必須加載安裝的(但一般系統(tǒng)會自動進行安裝)。另外,若你系統(tǒng)中SCSI支持也是模塊方式,那么scsi_mod模塊和sd_mod模塊也要加載安裝。</p><p> 在加載完這些模塊后,我們插入U盤或存儲卡,
32、就會發(fā)現(xiàn)系統(tǒng)中多了一個SCSI硬盤,通過正確地mount它,就可以使用了。mount /dev/你的U盤設(shè)備文件名 /目標掛載目錄</p><p><b> 實驗過程:</b></p><p><b> 查看內(nèi)核源碼</b></p><p> 查看系統(tǒng)目錄/usr/src/kernels,看在這目錄下是否有2.6.x
33、 的內(nèi)核版本源碼,并且確保內(nèi)核源碼的完整性。如果這個目錄下沒有相應的內(nèi)核源碼,那可以到網(wǎng)上下載等同于系統(tǒng)版本或低于系統(tǒng)版本的源碼,如果該目錄下有系統(tǒng)源碼,那么可以跳過以下對下載來的內(nèi)核源碼的配置及編譯。本次的Linux系統(tǒng)安裝時在該目錄下產(chǎn)生的源碼并不完整,因此本次用2.6.16版本的內(nèi)核做USB驅(qū)動開發(fā)。</p><p> 配置與編譯2.6.16版本內(nèi)核</p><p> 進入2.6
34、.16內(nèi)核版本目錄,將系統(tǒng)源碼/usr/src/kernels/ 2.6.18-53.el5-i686目錄下的隱藏文件.config拷貝到此目錄,隱藏文件.config為硬件配置與系統(tǒng)設(shè)置文件,是安裝系統(tǒng)時根據(jù)用戶的配置信息自動生成的,為了方便本次開發(fā),直接拷貝到此目錄。也可以在內(nèi)核根目錄下執(zhí)行:make menuconfig(基于文本模式的菜單型配置)進行相應的內(nèi)核配置。</p><p> 在內(nèi)核根目錄下執(zhí)行
35、:make bzImage,實現(xiàn)對整個內(nèi)核重新編譯,這個過程可能要持續(xù)一個小時左右。執(zhí)行結(jié)束后,可以看到在當前目錄下生成了一個新的文件: vmlinux, 其屬性為-rwxr-xr-x。</p><p> 這樣就完成了對2.6.16版本內(nèi)核的配置與編譯,下面在此版本內(nèi)核中實現(xiàn)對U盤驅(qū)動的開發(fā)。</p><p> 獲取、配置目標U盤出廠信息</p><p> 將
36、Kingston U盤設(shè)備插到主機上,通過cat /proc/bus/usb/devices得到當前系統(tǒng)探測到的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> 進入linux-2.6.16內(nè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盤的信息注冊,就可以讓驅(qū)動去認識和發(fā)現(xiàn)它。為了實現(xiàn)我們的U盤驅(qū)動,添加如下代碼:</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ū)動模塊的注冊與注銷</p><p> 打開drivers/usb/storage/ usb.c文件,可以看到該
40、文件完成了對U盤設(shè)備的注冊、注銷等一系列的功能。修改如下代碼:</p><p> //將U盤驅(qū)動的名稱改為: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> //修改注冊函數(shù),讓注冊驅(qū)動時,在/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ū)動時輸出: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> 為了單獨編譯U盤驅(qū)動模塊(與內(nèi)核編
47、譯脫離開來,有利于節(jié)省編譯時間),修改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文件,將會產(chǎn)生myUSBDriver.ko的U盤驅(qū)動文件。</p><p> Make產(chǎn)生myUSBDriver.ko驅(qū)動文件</p><p> 在drivers/usb/storage目錄下(也可以將storage文件夾拷貝到別的地方)執(zhí)行命
57、令:make,如下所示:</p><p> 最后產(chǎn)生了myUSBDriver.ko驅(qū)動文件,如下所示:</p><p> 卸掉原來系統(tǒng)中U盤驅(qū)動:usb-storage.ko</p><p> 在/lib/modules/2.6.18-53.el5/kernel/drivers/usb/storage/目錄下,將已存在的文件usb-storage.ko修改為u
58、sb-storage,因為該目錄下的硬件驅(qū)動存在依賴關(guān)系,即使U盤驅(qū)動沒有安裝,當插入U盤時,該目錄下的.ko驅(qū)動文件會自動進行安裝,這樣修改是為了避免自動安裝U盤驅(qū)動,以便調(diào)試我們編寫的U盤驅(qū)動。執(zhí)行如下:</p><p> 插入U盤,執(zhí)行命令:cat /proc/bus/usb/devices,但是依然會發(fā)現(xiàn)我們的U盤乃然使用usb-storage驅(qū)動。如下所示</p><p>
59、拔出U盤,執(zhí)行命令:rmmod usb-storage,執(zhí)行對usb-storage模塊驅(qū)動的卸載,執(zhí)行如下所示,由命令:lsmod可知系統(tǒng)中已經(jīng)沒有了usb-storage驅(qū)動模塊。</p><p> 插入U盤,這時會發(fā)現(xiàn)U盤沒有使用任何驅(qū)動程序,如下所示</p><p> 這樣就完成了對原來系統(tǒng)中U盤驅(qū)動usb-storage.ko的卸載。</p><p>
60、 安裝myUSBDriver.ko U盤驅(qū)動模塊</p><p> 在storage目錄中執(zhí)行命令:insmod myUSBDriver.ko,這樣就完成了對我們U盤驅(qū)動模塊的安裝,如下所示:</p><p> 執(zhí)行命令:cat /var/log/messge 查看日志文件,如果輸出我們的注冊信息:myUSBDriver Initializing 2011-6-15,則表示我們的驅(qū)
61、動安裝成功,如下所示:</p><p> 可知,我們的U盤驅(qū)動已成功注冊安裝!</p><p> 也可執(zhí)行命令:lsmod查看已安裝的模塊驅(qū)動,如下所示:</p><p> 實現(xiàn)驅(qū)動myUSBDriver綁定到我們的U盤</p><p> 把我們的U盤插入到主機中,執(zhí)行命令:cat /proc/bus/usb/devices,可以查看
62、U盤使用的驅(qū)動,如下所示:</p><p> 可見我們的驅(qū)動已經(jīng)和我們的U盤綁定在一起了。執(zhí)行命令:cat /var/log/messge 查看日志文件,如下所示:</p><p> 可見在/dev/下生成設(shè)備文件sdb4,現(xiàn)在就可以對這個設(shè)備文件進行掛載,并且打開、讀寫、關(guān)閉等的操作了。</p><p> 執(zhí)行命令:ls –la /dev/sdb4,如下&l
63、t;/p><p> 可見,邏輯設(shè)備節(jié)點sdb4為塊類型的設(shè)備文件,對應于我們的U盤,該設(shè)備文件的主設(shè)備號為:8,次設(shè)備號為:20,我們可以對塊設(shè)備文件進行直接存取操作。</p><p> 同樣在窗體界面操作時,我們會發(fā)現(xiàn)在計算機中存在了我們的U盤SCSI 設(shè)備,如下所示:</p><p> 我們可以在窗體界面下直接對我們的U盤進行訪問。</p>&l
64、t;p> 這樣我們的U盤驅(qū)動程序的編寫就實現(xiàn)了。</p><p> 卸載、注銷myUSBDriver驅(qū)動</p><p> 執(zhí)行命令:rmmmod myUSBDriver 對驅(qū)動myUSBDriver進行卸載(當U盤在使用該驅(qū)動時,無法卸載),如下所示:</p><p> 執(zhí)行命令:cat /var/log/messge 查看日志文件,如下:</
65、p><p> 可見,在日志文件中輸出:myUSBDriver removing 2011-6-15,即為我們修改的注銷函數(shù)輸出信息,這樣更進一步表明了我們驅(qū)動開發(fā)的正確性。</p><p> 執(zhí)行命令:lsmod可以查看到已經(jīng)沒有了myUSBDriver驅(qū)動!</p><p> 實現(xiàn)自動加載myUSBDriver驅(qū)動模塊</p><p>
66、 為了實現(xiàn)當插上U盤時可以自動加載安裝myUSBDriver驅(qū)動模塊,可以把myUSBDriver驅(qū)動模塊拷貝到/lib/modules/ 2.6.18-53.el5/ kernel/drivers/usb/storage/目錄下,然后在該目錄下depmod一下(depmod用于分析可載入模塊的相依性,depmod可檢測模塊的相依性,供modprobe在安裝模塊時使用)(modprobe與insmod的區(qū)別:modprobe主要加載系統(tǒng)
67、已經(jīng)通過depmod登記過的模塊,insmod一般是針對具體.o文件進行加載),那么你在插入USB設(shè)備的時候,系統(tǒng)就會自動為你加載驅(qū)動模塊的,當然這個得有hotplug(熱插拔的掛載機制)的支持。自動掛載磁盤分區(qū)的操作從底層來說,是要內(nèi)核支持的,2.6 內(nèi)核的sysfs 虛擬文件系統(tǒng)就提供了這一支持,這個文件系統(tǒng) (/sys/) 通常用于反應系統(tǒng)硬件信息,總線上的設(shè)備變化、網(wǎng)絡(luò)設(shè)備的變化等事件在這里都能反應出來,這個文件系統(tǒng)的變化配合上
68、內(nèi)核的 hotplug 機制就可以掌握硬件改動相關(guān)的信息。如下所示:</p><p> 確保系統(tǒng)沒有安裝加載myUSBDriver驅(qū)動模塊后,插入我們的U盤,這時在計算機中會發(fā)現(xiàn)我們的U盤的SCSI 設(shè)備,執(zhí)行命令:cat /proc/bus/usb/devices,如下:</p><p> 可以發(fā)現(xiàn),系統(tǒng)已經(jīng)為我們自動加載了myUSBDriver驅(qū)動,這樣就方便了我們重啟電腦后的一系
69、列驅(qū)動加載安裝的麻煩。同樣可以執(zhí)行cat /var/log/message查看相關(guān)的日志信息。</p><p> 這樣就完成了我們需要的自動加載myUSBDriver驅(qū)動模塊!</p><p><b> 實驗總結(jié):</b></p><p> 本次課程設(shè)計,已經(jīng)完全達到了開發(fā)U盤驅(qū)動的需求,也為開發(fā)別的硬件的U盤提供了在Linux系統(tǒng)下開發(fā)
70、的參考,更為開發(fā)別的USB設(shè)備提供了思路。通過本次課程設(shè)計,使我們對Linux內(nèi)核有了更深的了解,進一步為內(nèi)核的移植打下了基礎(chǔ),同時在這過程中也讓我們體會到了Linux系統(tǒng)源代碼開放的極大好處與帶來的樂趣。Linux值得去學,值得去深入了解探討,對于本次實驗,我對Linux又有了深層次的理解與體會,對于項目開發(fā)有了一定的經(jīng)驗,但是同時,要真正把linux用于實踐中我們還要付出更大的努力,雖然現(xiàn)在有關(guān)嵌入式linux開發(fā)的資料一大把,但要
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- linux課程設(shè)計報告--linux操作系統(tǒng)應用
- linux操作系統(tǒng)課程設(shè)計
- linux操作系統(tǒng)基礎(chǔ)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計報告--linux二級文件系統(tǒng)設(shè)計
- linux操作系統(tǒng)應用課程整體設(shè)計
- linux操作系統(tǒng)課程整體教學設(shè)計
- linux操作系統(tǒng)應用課程整體設(shè)計
- 課程設(shè)計---操作系統(tǒng)課程設(shè)計之linux磁盤空間管理
- 操作系統(tǒng)課程設(shè)計報告-linux頁面換入換出分析、進程管理器
- 操作系統(tǒng)課程設(shè)計linux二級文件系統(tǒng)設(shè)計
- linux操作系統(tǒng)課程設(shè)計--頁面置換算法模擬
- linux字符設(shè)備驅(qū)動課程設(shè)計報告
- 操作系統(tǒng)課程設(shè)計報告--驅(qū)動調(diào)度
- 課程設(shè)計--linux操作系統(tǒng)安全性的研究
- linux操作系統(tǒng)驅(qū)動框架附驅(qū)動加載
- 《linux操作系統(tǒng)》課程標準
- linux操作系統(tǒng)課程論文模板
- linux課程設(shè)計報告
- 2011180012linux操作系統(tǒng)課程設(shè)計報告web服務器的實現(xiàn)
- 2011180012linux操作系統(tǒng)課程設(shè)計報告web服務器的實現(xiàn)
評論
0/150
提交評論