计算机操作系统-设备驱动实现实验报告
實(shí)驗(yàn)?zāi)康?/h2>
1、 熟悉 linux 下驅(qū)動程序設(shè)計(jì)
2、 了解 linux 下字符設(shè)備驅(qū)動設(shè)計(jì)
實(shí)驗(yàn)要求
一、內(nèi)核編譯提供以下實(shí)驗(yàn)的環(huán)境
二、ubantu14.04 32 位下第一個(gè) hello world 驅(qū)動程序
??編寫驅(qū)動程序時(shí),首先必須建立內(nèi)核源碼樹,即下載源碼后,執(zhí)行 make 編譯后的形式,它是編譯驅(qū)動的前提。ubuntu 系統(tǒng)默認(rèn)情況下是沒有的。先前的內(nèi)核只需要有一套內(nèi)核頭文件就夠了,內(nèi)核模塊編譯時(shí)需要內(nèi)核源碼樹中的目標(biāo)文件,通過這種方式,可得到一個(gè)更加健壯的模塊裝載器,但也需要這些目標(biāo)文件存在于內(nèi)核目錄樹中。
三、 ubantu14.04 第二個(gè) memory 驅(qū)動程序
四、ubantu14.04 第三個(gè)使用文件私有數(shù)據(jù)的 globalmem 的設(shè)備
實(shí)驗(yàn)環(huán)境
Pc電腦一臺 ,學(xué)校機(jī)房C203,17號電腦(Linux系統(tǒng))
內(nèi)核編譯教程
Linux設(shè)備驅(qū)動指導(dǎo)
實(shí)驗(yàn)步驟、過程
(含原理圖、流程圖、關(guān)鍵代碼,或?qū)嶒?yàn)過程中的記錄、數(shù)據(jù)等)
實(shí)驗(yàn)步驟
一、內(nèi)核編譯提供以下實(shí)驗(yàn)的環(huán)境
如果安裝系統(tǒng)時(shí),自動安裝了源碼。在 /usr/src 目錄下有對應(yīng)的使用的版本目錄,ubuntu 系統(tǒng)默認(rèn)情況下是沒有的,如下所示:
下載完成后,在/usr/src 下會有壓縮包,然后解壓,解壓后生成一個(gè)新的目錄/usr/src/linux-source-4.10.0-19
開始配置內(nèi)核 選擇最快的原版的配置(默認(rèn))方式 。
當(dāng)然你也可以使用 自己喜歡的配置方式 如 menuconfig , xconfig(必須有 GTK 環(huán)境吧)。
執(zhí)行結(jié)束后,可以看到在當(dāng)前目錄下生成了一個(gè)新的文件: vmlinux 。
二、ubantu14.04 32 位下第一個(gè) hello world 驅(qū)動程序
三、 ubantu14.04 第二個(gè) memory 驅(qū)動程序
①到包含 Makefile 和 mydm1.c 的目錄下執(zhí)行 make,生成 mydm1.ko;
②執(zhí)行 sudo insmod mydm1.ko;
③驗(yàn)證:lsmod | grep mydm1
④需要?jiǎng)?chuàng)建一個(gè)文件(該設(shè)備文件用于和設(shè)備驅(qū)動操作)mknod /dev/fgj c 224 0 c 代表字符設(shè)備 224為主設(shè)備號,0 為從設(shè)備號
⑤ gcc test.c,然后執(zhí)行:sudo ./a.out 輸出如下:open/dev/fgjsuccessfully ,write successfully。
四、ubantu14.04 第三個(gè)使用文件私有數(shù)據(jù)的 globalmem 的設(shè)備
程序說明及實(shí)現(xiàn)
一、內(nèi)核編譯提供以下實(shí)驗(yàn)的環(huán)境
二、ubantu14.04 32 位下第一個(gè) hello world 驅(qū)動程序
① hello.c文件。源代碼如圖10所示。
圖10 hello.c文件源代碼② Makefile文件。源代碼如圖11所示。
圖11 Makefile文件源代碼對Makefile文件的編寫進(jìn)行簡單解釋:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules這句是Makefile的規(guī)則:這里的$ (MAKE)就相當(dāng)于make,-C 選項(xiàng)的作用是指將當(dāng)前工作目錄轉(zhuǎn)移到你所指定的位置。“M=”選項(xiàng)的作用是,當(dāng)用戶需要以某個(gè)內(nèi)核為基礎(chǔ)編譯一個(gè)外部模塊的話,需要在make modules 命令中加入“M=dir”,程序會自動到你所指定的dir目錄中查找模塊源碼,將其編譯,生成ko文件
注意:$ (MAKE) -C $ (KERNELDIR) M=$ (PWD) modules和$ (MAKE) -C $ (KERNELDIR) M=$ (PWD) modules_install前面為tab占位符。
三、 ubantu14.04 第二個(gè) memory 驅(qū)動程序
如圖16所示。
①到包含 Makefile 和 mydm1.c 的目錄下執(zhí)行 make,生成 mydm1.ko,如圖20所示。并且使用“l(fā)l”查看當(dāng)前目錄可以看到相關(guān)文件,如圖21所示。
②執(zhí)行“sudo insmod mydm1.ko”加載模塊并執(zhí)行“l(fā)smod”查看加載情況,如圖22,圖23所示。
圖22 加載“mydm1”模塊 圖23 查看是否加載“mydm1”模塊③驗(yàn)證:“l(fā)smod | grep mydm1”輸出如圖24所示。
圖24 驗(yàn)證結(jié)果④需要?jiǎng)?chuàng)建一個(gè)文件(該設(shè)備文件用于和設(shè)備驅(qū)動操作)“mknod /dev/fgj c 224 0 ”代表字符設(shè)備 224為主設(shè)備號,0 為從設(shè)備號。如圖25所示。
圖25 創(chuàng)建設(shè)備驅(qū)動相關(guān)文件⑤“gcc test.c”,如圖26所示。然后執(zhí)行:“sudo ./a.out ”輸出如圖27所示。
圖26 “gcc test.c”編譯test.c文件 圖27 執(zhí)行“a.out”文件效果四、ubantu14.04 第三個(gè)使用文件私有數(shù)據(jù)的 globalmem 的設(shè)備
① 創(chuàng)建并編寫test.c文件用于測試。如圖35,圖36所示。
② 執(zhí)行“gcc test.c”編譯test.c文件,如圖37所示。然后執(zhí)行:“sudo ./a.out ”輸出如圖38所示。
圖37 編譯test.c文件 圖38 最終執(zhí)行結(jié)果實(shí)驗(yàn)結(jié)果或總結(jié)
(對實(shí)驗(yàn)結(jié)果進(jìn)行相應(yīng)分析,或總結(jié)實(shí)驗(yàn)的心得體會,并提出實(shí)驗(yàn)的改進(jìn)意見)
實(shí)驗(yàn)結(jié)果:
一、 內(nèi)核編譯提供以下實(shí)驗(yàn)的環(huán)境
實(shí)驗(yàn)室已經(jīng)有提供編譯好的內(nèi)核,因?yàn)楸救藢⒕幾g內(nèi)核的流程大致進(jìn)行了一遍。
二、 ubantu14.04 32 位下第一個(gè) hello world 驅(qū)動程序
三、 ubantu14.04 第二個(gè) memory 驅(qū)動程序
圖40 第二個(gè) memory 驅(qū)動程序最終效果圖四、 ubantu14.04 第三個(gè)使用文件私有數(shù)據(jù)的 globalmem 的設(shè)備
圖41 第三個(gè)使用文件私有數(shù)據(jù)的 globalmem 的設(shè)備最終效果圖 將本實(shí)驗(yàn)用到的“test1,test2,test3”三個(gè)文件夾的目錄結(jié)構(gòu)展示如圖42,圖43,圖44。 圖42 test1文件夾目錄結(jié)構(gòu) 圖43 test2文件夾目錄結(jié)構(gòu) 圖44 test3文件夾目錄結(jié)構(gòu)建議
提供可以編譯內(nèi)核虛擬機(jī)環(huán)境,這樣可以節(jié)省不少時(shí)間。
心得體會
通過這次可以總結(jié)編寫Linux系統(tǒng)下的驅(qū)動程序步驟:①建立Linux的驅(qū)動骨架(裝載和卸載Linux驅(qū)動)任何類型的程序都有一個(gè)基本結(jié)構(gòu),linux驅(qū)動程序也不例外。Linux內(nèi)核在使用驅(qū)動時(shí)首先需要裝載驅(qū)動。在裝載過程中也需要進(jìn)行一些初始化的工作。②注冊和注銷設(shè)備文件任何一個(gè)linux驅(qū)動都需要一個(gè)設(shè)備文件,否則應(yīng)用程序?qū)o法與驅(qū)動程序交互。③指定與驅(qū)動相關(guān)的信息驅(qū)動程序是自描述的。④指定回調(diào)函數(shù)一個(gè)驅(qū)動程序并不一定要指定所有的回調(diào)函數(shù)。⑤編寫業(yè)務(wù)邏輯⑥編寫Makefile文件⑦編寫Linux驅(qū)動程序⑦安裝和卸載Linux驅(qū)動。基本了解了Linux系統(tǒng)下的驅(qū)動程序編寫方法,對驅(qū)動程序有了更加深刻的認(rèn)識。
在剛開始接觸驅(qū)動程序時(shí),遇到了很多很多的問題,當(dāng)時(shí)就特別想放棄,好在我及時(shí)的尋求了同學(xué)的幫助。同學(xué)很熱心的幫助我解答問題,我這才慢慢找到了驅(qū)動程序的“套路”。通過本次實(shí)驗(yàn),我同樣學(xué)到了Linux系統(tǒng)下“make”命令的用法。起初,我對“make”知之甚少,只是聽說過,但是從來沒有用過。直到這次實(shí)驗(yàn),我才認(rèn)識到它的強(qiáng)大用處。“make”是用來編譯的,它從Makefile中讀取指令,然后進(jìn)行編譯。它的強(qiáng)大之處就在于不僅可以用于編譯眾多互相關(guān)聯(lián)的源代碼文件,而且還可以編譯內(nèi)核模塊。
總結(jié)
以上是生活随笔為你收集整理的计算机操作系统-设备驱动实现实验报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql my.ini位置错误_解决m
- 下一篇: Windows系统字体和系统应用字体