操作系统设备驱动实验实验报告
華中農(nóng)業(yè)大學(xué) 學(xué)生實(shí)驗(yàn)報(bào)告
日期: 2019 年 12 月 20 日 成績
課程名稱 計(jì)算機(jī)操作系統(tǒng) 實(shí)驗(yàn)名稱 設(shè)備驅(qū)動(dòng)實(shí)驗(yàn) 實(shí)驗(yàn)類型 驗(yàn)證 設(shè)計(jì)
綜合 創(chuàng)新
【實(shí)驗(yàn)?zāi)康摹?br /> 實(shí)驗(yàn)?zāi)康?#xff1a;熟悉Linux下驅(qū)動(dòng)程序設(shè)計(jì)
編譯內(nèi)核
實(shí)驗(yàn)要求:在Linux系統(tǒng)下,編譯內(nèi)核,并在該內(nèi)核下完成實(shí)驗(yàn);
自主設(shè)計(jì)驅(qū)動(dòng)程序,完成驅(qū)動(dòng)程序的安裝
【實(shí)驗(yàn)內(nèi)容】
1.編譯內(nèi)核
2. ubantu14.04 32位下第一個(gè)hello world驅(qū)動(dòng)程序
3. ubantu14.04第二個(gè)memory驅(qū)動(dòng)程序
4. ubantu14.04第三個(gè)使用文件私有數(shù)據(jù)的globalmem的設(shè)備
5. Linux設(shè)備驅(qū)動(dòng)中的阻塞與非阻塞I/O
【實(shí)驗(yàn)環(huán)境】(含主要設(shè)計(jì)設(shè)備、器材、軟件等)
Pc電腦一臺(tái)
【實(shí)驗(yàn)步驟、過程】(含原理圖、流程圖、關(guān)鍵代碼,或?qū)嶒?yàn)過程中的記錄、數(shù)據(jù)等)
內(nèi)容:
編譯內(nèi)核過程:
編譯內(nèi)核代碼截圖:
第一個(gè)hello world驅(qū)動(dòng)程序:
編寫hello. c程序并寫Makefile文件;
之后通過make指令,生成hello.ko等其他文件;
執(zhí)行sudo insmod hello.ko,在lsmod即可驗(yàn)證模塊是否已裝載,最后rmmod移出模塊;
通過cat /var/log/syslog | grep world來觀察其輸出。
注意:版本號要改
由于用到printk,相關(guān)輸出信息可以cat/var/log/syslog | grep world查看。
第二個(gè)memory驅(qū)動(dòng)程序
首先編寫程序,根據(jù)設(shè)備號,從內(nèi)核空間將數(shù)據(jù)取出,寫入相應(yīng)的設(shè)備空間內(nèi);
再通過程序創(chuàng)建主從設(shè)備,將數(shù)據(jù)寫入,再通過模塊功能讀出,觀察其輸出。
執(zhí)行結(jié)果:
使用文件私有數(shù)據(jù)的globalmem的設(shè)備驅(qū)動(dòng):
Linux設(shè)備驅(qū)動(dòng)中的阻塞與非阻塞I/O:
阻塞和非阻塞 I/O 是設(shè)備訪問的兩種不同模式,驅(qū)動(dòng)程序可以靈活的支持用戶空間對設(shè)備的這兩種訪問方式。
本例子講述了這兩者的區(qū)別 并實(shí)現(xiàn) I/O 的等 待隊(duì)列機(jī)制, 并進(jìn)行了用戶空間的驗(yàn)證
基本概念: 1> 阻塞操作 是指 在執(zhí)行設(shè)備操作時(shí),若不能獲得資源,則掛起進(jìn)程直到滿足操作條件后再進(jìn)行操作。被掛起的進(jìn)程進(jìn)入休眠,被從調(diào)度器移走,直到條件滿足。
2> 非阻塞操作在不能進(jìn)行設(shè)備操作時(shí),并不掛起,它或者放棄,或者不停地查詢,直到可以進(jìn)行操作。非阻塞應(yīng)用程序通常使用 select 系統(tǒng)調(diào)用查詢是否可以對設(shè)備進(jìn)行無阻塞的訪問終會(huì)引發(fā)設(shè)備驅(qū)動(dòng)中 poll 函數(shù)執(zhí)行。
通過Up和down獲取信號量以及釋放信號量。
加入輪詢方式,判斷FIFO空和滿。
結(jié)果截圖:
指令跟上面幾個(gè)類似。
【實(shí)驗(yàn)結(jié)果或總結(jié)】(對實(shí)驗(yàn)結(jié)果進(jìn)行相應(yīng)分析,或總結(jié)實(shí)驗(yàn)的心得體會(huì),并提出實(shí)驗(yàn)的改進(jìn)意見)
1.編譯內(nèi)核的時(shí)候,大致了解了編譯內(nèi)核的指令以及對目錄樹的了解。
2. uname -r 查看內(nèi)核的版本號,自己采用ubantu的版本號是4.15.0
3. 編寫 hello world 程序以及加載驅(qū)動(dòng)的時(shí)候,module_init(hello_init); module_exit(hello_exit); 這兩個(gè)是函數(shù)的入口地址和出口地址。
Makefile文件記得更給KERNELDIR := /lib/modules/3.13.0-32-generic/build的版本號包括32也需要改成自己電腦相匹配的。
4. $(MAKE) -C (KERNELDIR)M=(KERNELDIR) M=(KERNELDIR)M=(PWD) modules 這句是 Makefile 的規(guī)則:這里的KaTeX parse error: Expected 'EOF', got '&' at position 229: …vMajor,"mydm1",&?simple_fops); …(shell uname -r)/build 則是用腳本的方法獲取 uname -r 即可不用對代碼進(jìn)行修改,動(dòng)態(tài)獲取內(nèi)核的版本信息。 clean: rm *.o *.ko *.mod.c *.order *.symvers 清除 這些文件。
8。需要?jiǎng)?chuàng)建一個(gè)文件(該設(shè)備文件用于和設(shè)備驅(qū)動(dòng)操作) mknod /dev/fgj c 224 0 c 代表字符設(shè)備 224 為主設(shè)備號,0 為從設(shè)備號
9. 使用文件私有數(shù)據(jù)的globalmem的設(shè)備驅(qū)動(dòng) :用到了內(nèi)核區(qū)的字符設(shè)備,將輸入的字符存儲(chǔ)到全局內(nèi)存區(qū)域,再從用戶空間中訪問這個(gè)區(qū)域,獲取到其中的數(shù)據(jù)。struct globalmem_dev { struct cdev cdev; //cdev 結(jié)構(gòu)體 unsigned char mem[GLOBALMEM_SIZE]; //全局內(nèi)存 }; globalmem 的設(shè)備結(jié)構(gòu)體:包含了對應(yīng)于 globalmem 字符設(shè)備的 cdev 和 使用內(nèi)存 mem[GLOBALMEM_SIZE],其他與上一個(gè)實(shí)驗(yàn)類似。增加了一個(gè)ioctl函數(shù):ioctl()函數(shù)接受的 MEM_CLEAR 命令,這個(gè)命令將全局內(nèi)存的有效數(shù)據(jù)長度 清零,對于設(shè)備不支持的命令,ioctl()函數(shù)應(yīng)該返回-EINVAL。,mknod /dev/globalmem c 354 0, echo ‘good nihao’ > /dev/globalmem, cat /dev/globalmem 即可驗(yàn)證輸出 ,cat是讀出,echo是寫入。
10. Linux設(shè)備驅(qū)動(dòng)中的阻塞和非阻塞驅(qū)動(dòng),理解了阻塞和非阻塞驅(qū)動(dòng)的區(qū)別,引入并發(fā)信號量的控制,其他的大致相同;利用存儲(chǔ)區(qū)的FIFO特性,實(shí)現(xiàn)用戶對內(nèi)核存儲(chǔ)區(qū)的阻塞和非阻塞兩種訪問方式,可以為其提供靈活的支持。而這里的測試程序,則是向設(shè)備區(qū)的文件中寫入一定量的數(shù)據(jù),在FIFO區(qū)空時(shí),會(huì)不斷輸出“can be written”,在FIFO區(qū)滿后,會(huì)不斷輸出“can be read”,而在FIFO去不空不滿時(shí),則會(huì)交替輸出。運(yùn)行時(shí)由于會(huì)出現(xiàn)設(shè)備被占用的情況,需要更改設(shè)備號。但自己寫入數(shù)據(jù)的時(shí)候,并沒有出現(xiàn)read.
11.通過這次實(shí)驗(yàn)體會(huì)到了用戶態(tài)和內(nèi)核態(tài)編譯的差異,初步掌握了設(shè)備驅(qū)動(dòng)的基本原理,對于阻塞和非阻塞,異步方式有了初步的了解,這對于自己的學(xué)習(xí)有很大幫助。
總結(jié)
以上是生活随笔為你收集整理的操作系统设备驱动实验实验报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用用window.open()
- 下一篇: ktv服务器管理系统,小型KTV综合解决