版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、中 南 大 學(xué)字符設(shè)備驅(qū)動(dòng)程序課程設(shè)計(jì)報(bào)告姓名:王學(xué)彬?qū)I(yè)班級(jí):信安1002班學(xué)號(hào):0909103108課程:操作系統(tǒng)安全課程設(shè)計(jì)指導(dǎo)老師:張士庚一、課程設(shè)計(jì)目的1. 了解Linux字符設(shè)備驅(qū)動(dòng)程序的結(jié)構(gòu);2. 掌握Linux字符設(shè)備驅(qū)動(dòng)程序常用結(jié)構(gòu)體和操作函數(shù)的使用方法;3. 初步掌握Linux字符設(shè)備驅(qū)動(dòng)程序的編寫方法及過程;4. 掌握Linux字符設(shè)備驅(qū)動(dòng)程序的加載方法及測(cè)試方法。二、課程設(shè)計(jì)內(nèi)容5. 設(shè)計(jì)Windows XP或者Linux操作系統(tǒng)下的設(shè)備驅(qū)動(dòng)程序;6. 掌握虛擬字符設(shè)備的設(shè)計(jì)方法和測(cè)試方法;7. 編寫測(cè)試應(yīng)用程序,測(cè)試對(duì)該設(shè)備的讀寫等操作。三、需求分析3.1驅(qū)動(dòng)程序介紹
2、驅(qū)動(dòng)程序負(fù)責(zé)將應(yīng)用程序如讀、寫等操作正確無誤的傳遞給相關(guān)的硬件,并使硬件能夠做出正確反應(yīng)的代碼。驅(qū)動(dòng)程序像一個(gè)黑盒子,它隱藏了硬件的工作細(xì)節(jié),應(yīng)用程序只需要通過一組標(biāo)準(zhǔn)化的接口實(shí)現(xiàn)對(duì)硬件的操作。3.2 Linux設(shè)備驅(qū)動(dòng)程序分類Linux設(shè)備驅(qū)動(dòng)程序在Linux的內(nèi)核源代碼中占有很大的比例,源代碼的長(zhǎng)度日益增加,主要是驅(qū)動(dòng)程序的增加。雖然Linux內(nèi)核的不斷升級(jí),但驅(qū)動(dòng)程序的結(jié)構(gòu)還是相對(duì)穩(wěn)定。Linux系統(tǒng)的設(shè)備分為字符設(shè)備(char device),塊設(shè)備(block device)和網(wǎng)絡(luò)設(shè)備(network device)三種。字符設(shè)備是指在存取時(shí)沒有緩存的設(shè)備,而塊設(shè)備的讀寫都有緩存來支
3、持,并且塊設(shè)備必須能夠隨機(jī)存取(random access)。典型的字符設(shè)備包括鼠標(biāo),鍵盤,串行口等。塊設(shè)備主要包括硬盤軟盤設(shè)備,CD-ROM等。網(wǎng)絡(luò)設(shè)備在Linux里做專門的處理。Linux的網(wǎng)絡(luò)系統(tǒng)主要是基于BSD unix的socket機(jī)制。在系統(tǒng)和驅(qū)動(dòng)程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)(sk_buff)進(jìn)行數(shù)據(jù)傳遞。系統(tǒng)有支持對(duì)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機(jī)制,提供對(duì)多協(xié)議的支持。3.3驅(qū)動(dòng)程序的結(jié)構(gòu)驅(qū)動(dòng)程序的結(jié)構(gòu)如圖3.1所示,應(yīng)用程序經(jīng)過系統(tǒng)調(diào)用,進(jìn)入核心層,內(nèi)核要控制硬件需要通過驅(qū)動(dòng)程序?qū)崿F(xiàn),驅(qū)動(dòng)程序相當(dāng)于內(nèi)核與硬件之間的“系統(tǒng)調(diào)用”。圖3.1驅(qū)動(dòng)程序的結(jié)構(gòu)3.3.1 內(nèi)核模
4、塊內(nèi)核模塊是Linux內(nèi)核的重要組成要素,內(nèi)核模塊能在Linux系統(tǒng)啟動(dòng)之后能夠動(dòng)態(tài)進(jìn)行裝載和卸載,因此不需對(duì)內(nèi)核進(jìn)行重新編譯或重啟系統(tǒng)就可將內(nèi)核的一部分替換掉,Linux內(nèi)核的所有設(shè)備驅(qū)動(dòng),文件系統(tǒng),網(wǎng)絡(luò)協(xié)議等可做成模塊的形式來提供。在所有的模塊中需記錄編譯的內(nèi)核版本信息,并與當(dāng)前執(zhí)行的內(nèi)核版本一致。即,模塊具有版本依賴性,如果不一樣就會(huì)出錯(cuò),當(dāng)然可以在模塊程序中的include<linux/module.h>之前通過宏定義#define_NO_VERSION_表明不定義模塊的版本信息。內(nèi)核模塊程序與一般應(yīng)用程序之間主要不同之處是,模塊程序沒有main()函數(shù),模塊程序在裝載時(shí)調(diào)
5、用init_module(void)函數(shù)添加到內(nèi)核中,在卸載時(shí)調(diào)用void cleanup_module( )函數(shù)從內(nèi)核中卸載。另外一個(gè)應(yīng)用程序從頭到尾只執(zhí)行一個(gè)任務(wù),但一個(gè)模塊可以把響應(yīng)未來請(qǐng)求的事務(wù)登記到內(nèi)核中,然后等待系統(tǒng)調(diào)用,內(nèi)核模塊程序結(jié)構(gòu)如圖3.2所示。圖3.2內(nèi)核模塊程序結(jié)構(gòu)3.4主、從設(shè)備號(hào)應(yīng)用程序通過設(shè)備文件系統(tǒng)(devfs)的名字(或節(jié)點(diǎn))訪問硬件設(shè)備,所有的設(shè)備節(jié)點(diǎn)在/dev目錄下。利用mknod命令生成設(shè)備文件系統(tǒng)的節(jié)點(diǎn),但只有超級(jí)用戶才能生成設(shè)備文。Mknod命令必須要有設(shè)備名和設(shè)備類型,主設(shè)備號(hào)(Major Number),次設(shè)備號(hào)(Minor Number)等3個(gè)
6、參數(shù)。主設(shè)備號(hào)用于內(nèi)核區(qū)分設(shè)備驅(qū)動(dòng),次設(shè)備號(hào)用于設(shè)備驅(qū)動(dòng)區(qū)分設(shè)備。一個(gè)設(shè)備驅(qū)動(dòng)可能控制多個(gè)設(shè)備。新的設(shè)備驅(qū)動(dòng)要有新的主設(shè)備號(hào)。在內(nèi)核源代碼的Documentation/devices.txt中定義了所有設(shè)備的主設(shè)備號(hào)。在創(chuàng)建設(shè)備的時(shí)候不要與常用的設(shè)備好沖突。3.5驅(qū)動(dòng)程序基本框架如果采用模塊方式編寫設(shè)備驅(qū)動(dòng)程序時(shí),通常至少要實(shí)現(xiàn)設(shè)備初始化模塊、設(shè)備打開模塊、數(shù)據(jù)讀寫與控制模塊、中斷處理模塊(有的驅(qū)動(dòng)程序沒有)、設(shè)備釋放模塊和、設(shè)備卸載模塊等幾個(gè)部分。3.6重要結(jié)構(gòu)體打開的設(shè)備在內(nèi)核內(nèi)部由file結(jié)構(gòu)標(biāo)識(shí),內(nèi)核使用file_operation結(jié)構(gòu)訪問驅(qū)動(dòng)程序函數(shù)。file_operation結(jié)構(gòu)
7、是一個(gè)定義在<linux/fs.h>中的函數(shù)指針數(shù)組。每個(gè)文件都與它自己的函數(shù)集相關(guān)聯(lián)。這個(gè)結(jié)構(gòu)中的每一個(gè)字段都必須指向驅(qū)動(dòng)程序中實(shí)現(xiàn)特定操作的函數(shù)。結(jié)構(gòu)如下,詳細(xì)內(nèi)容可查閱相關(guān)文檔。structfile_operationsstruct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char *, size_t, loff_t *);ssize_t (*write) (struct file *, const char *, size_t, l
8、off_t *);int (*readdir) (struct file *, void *, filldir_t);unsignedint (*poll) (struct file *, structpoll_table_struct *);int (*ioctl) (structinode *, struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, structvm_area_struct *);int (*open) (structinode *, struct file *);int (*flus
9、h) (struct file *);int (*release) (structinode *, struct file *);int (*fsync) (struct file *, structdentry *, intdatasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, structfile_lock *);ssize_t (*readv) (struct file *, conststructiovec *, unsigned long, loff_t *);ssize_t
10、 (*writev) (struct file *, conststructiovec *, unsigned long, loff_t *);ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);四、總體設(shè)計(jì)1 在對(duì)設(shè)備驅(qū)動(dòng)的有了充分的學(xué)習(xí)后,字符設(shè)備的驅(qū)動(dòng)程序我們確定采用
11、虛擬設(shè)備的驅(qū)動(dòng)程序?qū)崿F(xiàn)2 實(shí)現(xiàn)平臺(tái)為linux系統(tǒng),借助linux內(nèi)核對(duì)設(shè)備驅(qū)動(dòng)程序的抽象結(jié)構(gòu)體和內(nèi)核函數(shù)3 要明確定義虛擬設(shè)備的的設(shè)備結(jié)構(gòu)體4 實(shí)現(xiàn)模塊加載函數(shù)和卸載函數(shù)5 實(shí)現(xiàn)open(),close(),lseek(),write(),read()函數(shù)6 因源碼包中已包含makefile,故利用make命令交叉編譯memdev.c、test.c(已修改)等2個(gè)文件7 模塊的動(dòng)態(tài)加載,以及/dev/memdev節(jié)點(diǎn)的創(chuàng)建8 運(yùn)行test程序測(cè)試,觀察結(jié)果五、詳細(xì)設(shè)計(jì)1.在對(duì)設(shè)備驅(qū)動(dòng)的有了充分的學(xué)習(xí)后,字符設(shè)備的驅(qū)動(dòng)程序我們確定采用虛擬設(shè)備的驅(qū)動(dòng)程序?qū)崿F(xiàn),其中確定該設(shè)備主要的結(jié)構(gòu)體為: st
12、ruct mem_dev char *data; unsigned long size; ;2.實(shí)現(xiàn)平臺(tái)為linux系統(tǒng),借助linux內(nèi)核對(duì)設(shè)備驅(qū)動(dòng)程序的抽象結(jié)構(gòu)體和內(nèi)核函數(shù),要調(diào)用的內(nèi)核抽象體有: struct cdev cdev; /表示一個(gè)字符設(shè)備的內(nèi)核設(shè)備的抽象體 static const struct file_operations mem_fops = .owner = THIS_MODULE, .llseek = mem_llseek, .read = mem_read, .write = mem_write, .open = mem_open, .release = mem_
13、release,;3.要明確定義虛擬設(shè)備的的設(shè)備結(jié)構(gòu)體 struct mem_dev char *data; unsigned long size; ;4.實(shí)現(xiàn)模塊加載函數(shù)和卸載函數(shù)static int memdev_init(void) static int memdev_exit(void)5.實(shí)現(xiàn)open(),close(),lseek(),write(),read()函數(shù) int mem_open(struct inode *inode, struct file *filp); int mem_release(struct inode *inode, struct file *filp
14、); static ssize_t mem_read(struct file *filp, char _user *buf, size_t size, loff_t *ppos); static ssize_t mem_write(struct file *filp, const char _user *buf, size_t size, loff_t *ppos) static loff_t mem_llseek(struct file *filp, loff_t offset, int whence);6.編譯模塊,模塊的動(dòng)態(tài)加載,以及/dev/memdev節(jié)點(diǎn)的創(chuàng)建,mknod /dev
15、/memdev結(jié)果如下:模塊編譯完,后我們需要把內(nèi)核模塊動(dòng)態(tài)加載到內(nèi)核,用命令insmod memdev.ko加載,用命令lsmod顯示加載成功,結(jié)果為:7運(yùn)行test程序測(cè)試,觀察結(jié)果我們看到我們用應(yīng)用程序成功的寫入了”xiaotian!”并出設(shè)備中成功的讀出,證明我們的驅(qū)動(dòng)程序運(yùn)行完美。六、關(guān)鍵源代碼注解/*設(shè)備驅(qū)動(dòng)模塊加載函數(shù)*/static int memdev_init(void) int result; int i; dev_t devno = MKDEV(mem_major, 0); /*通過主設(shè)備號(hào)得到dev_t類型的設(shè)備號(hào)*/ /* 靜態(tài)申請(qǐng)?jiān)O(shè)備號(hào)*/ if (mem_maj
16、or) result = register_chrdev_region(devno, 2, "memdev"); else /* 動(dòng)態(tài)分配設(shè)備號(hào) */ result = alloc_chrdev_region(&devno, 0, 2, "memdev"); mem_major = MAJOR(devno); if (result < 0) return result; /*初始化cdev結(jié)構(gòu)*/ cdev_init(&cdev, &mem_fops);/使cdev與mem_fops聯(lián)系起來 cdev.owner = THI
17、S_MODULE;/owner成員表示誰擁有這個(gè)驅(qū)動(dòng)程序,使“內(nèi)核引用模塊計(jì)數(shù)”加1;THIS_MODULE表示現(xiàn)在這個(gè)模塊被內(nèi)核使用,這是內(nèi)核定義的一個(gè)宏 cdev.ops = &mem_fops; /* 注冊(cè)字符設(shè)備 */ cdev_add(&cdev, MKDEV(mem_major, 0), MEMDEV_NR_DEVS); /* 為設(shè)備描述結(jié)構(gòu)分配內(nèi)存*/ mem_devp = kmalloc(MEMDEV_NR_DEVS*sizeof(struct mem_dev), GFP_KERNEL);/目前為止我們始終用GFP_KERNEL if (!mem_devp) /
18、*申請(qǐng)失敗*/ result = - ENOMEM; goto fail_malloc; memset(mem_devp, 0, sizeof(struct mem_dev); /*為設(shè)備分配內(nèi)存*/ for (i=0; i < MEMDEV_NR_DEVS; i+) mem_devpi.size = MEMDEV_SIZE; mem_devpi.data = kmalloc(MEMDEV_SIZE, GFP_KERNEL);/分配出來的地址存在此 memset(mem_devpi.data, 0, MEMDEV_SIZE); return 0; fail_malloc: unregister_chrdev_region(devno, 1); return result;/*模塊卸載函數(shù)*/static void memdev_exit(void) cdev_d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 通信工程專業(yè)介紹
- 《公路工程預(yù)算定額》(2018版)系數(shù)調(diào)整全集
- 非織造布在空氣凈化產(chǎn)品的吸附性能與壽命考核試卷
- 非金屬礦物在電子封裝材料中的研究考核試卷
- 鑄造過程中的數(shù)值模擬與實(shí)驗(yàn)驗(yàn)證考核試卷
- 陶瓷企業(yè)的人力資源規(guī)劃與招聘考核試卷
- 高速鐵路國(guó)際比較與經(jīng)驗(yàn)借鑒考核試卷
- 船舶電氣設(shè)備考核試卷
- 味精產(chǎn)業(yè)發(fā)展趨勢(shì)-洞察分析
- 學(xué)校國(guó)防教育工作計(jì)劃
- 公司員工手冊(cè)-全文(完整版)
- 鍋爐習(xí)題帶答案
- 土木工程課程設(shè)計(jì)38281
- 農(nóng)村宅基地地籍測(cè)繪技術(shù)方案
- 液壓爬模作業(yè)指導(dǎo)書
- 劇院的建筑設(shè)計(jì)規(guī)范標(biāo)準(zhǔn)
- 開封辦公樓頂發(fā)光字制作預(yù)算單
- 遺傳分析的一個(gè)基本原理是DNA的物理距離和遺傳距離方面...
- 安全生產(chǎn)標(biāo)準(zhǔn)化管理工作流程圖
- 德龍自卸車合格證掃描件(原圖)
- 初一英語單詞辨音專項(xiàng)練習(xí)(共4頁(yè))
評(píng)論
0/150
提交評(píng)論