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