日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

计算机操作系统-设备驱动实现实验报告

發(fā)布時(shí)間:2023/12/10 windows 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机操作系统-设备驱动实现实验报告 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(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)境

  • uname -r 查看內(nèi)核版本 ,輸出: 4.10.0-19-generic
    如果安裝系統(tǒng)時(shí),自動安裝了源碼。在 /usr/src 目錄下有對應(yīng)的使用的版本目錄,ubuntu 系統(tǒng)默認(rèn)情況下是沒有的,如下所示:
  • ls /usr/src,輸出:linux-headers- 4.10.0-19,linux-headers- 4.10.0-19-generic 。
  • 查看一下可一下載的源碼包(切記不要使用超級用戶使用此命令否則……會提示沒有此命令)執(zhí)行:apt-cache search linux-source,輸出: linux-source-4.10.0-19 - Linux kernel source for version 4.10.0-19 with Ubuntu patches 。
  • 執(zhí)行:sudo apt-get install linux-source-4.10.0-19
    下載完成后,在/usr/src 下會有壓縮包,然后解壓,解壓后生成一個(gè)新的目錄/usr/src/linux-source-4.10.0-19
    開始配置內(nèi)核 選擇最快的原版的配置(默認(rèn))方式 。
  • 執(zhí)行:make oldconfig
    當(dāng)然你也可以使用 自己喜歡的配置方式 如 menuconfig , xconfig(必須有 GTK 環(huán)境吧)。
  • 執(zhí)行:make bzImage
    執(zhí)行結(jié)束后,可以看到在當(dāng)前目錄下生成了一個(gè)新的文件: vmlinux 。
  • 執(zhí)行:make modules 和 make modules_install,執(zhí)行結(jié)束之后,會在/lib/modules 下生成新的目錄/lib/modules/3.13.0-32-generic/,若由于主機(jī)本身內(nèi)核版本就為 3.13.0-32-generic,所以/lib/modules/3.13.0-32-generic/本身就存在,所以 make modules 和 make modules_install 兩步就不需要執(zhí)行了。至此,構(gòu)造內(nèi)核源碼樹完成。【注意:如果沒有建立內(nèi)核源碼樹,按下面步驟,雖然能夠生成 hello.ko,但執(zhí)行 sudo insmod hello.ko 后,執(zhí)行 lsmod 會沒反應(yīng),導(dǎo)致系統(tǒng)報(bào)告問題,會導(dǎo)致下次開機(jī)或重啟時(shí)有問題,若啟動不了,可以進(jìn)入 recovery 模式,執(zhí)行 fsck,開機(jī)做嵌入式 linux 開發(fā)一般在 PC 機(jī)上編譯好了,下到板子上去運(yùn)行,板子上的 linux 內(nèi)核和 PC 機(jī)上的 linux 版本很多時(shí)候都是不一樣的,比如 pc 機(jī)上的是 linux2.6,板子上的是 linux3.1,這個(gè)時(shí)候就要下 linux3.1 的內(nèi)核,用它編譯的驅(qū)動模塊在板子上才能加載上,不然會出錯(cuò)。】
  • 二、ubantu14.04 32 位下第一個(gè) hello world 驅(qū)動程序

  • c 文件以及 Makefile 文件
  • 到hello.c文件目錄下執(zhí)行make,會生成hello.ko文件以及其他相關(guān)文件。
  • 執(zhí)行sudo insmod .hell.ko 加載模塊
  • 執(zhí)行l(wèi)smod就可以看到hello模塊了
  • sudo rmmod hello
  • 三、 ubantu14.04 第二個(gè) memory 驅(qū)動程序

  • 編寫mydm1.c
  • 編寫 Makefile文件
  • 編寫test.c文件
  • 運(yùn)行:
    ①到包含 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è)備

  • 編寫globalmem.c代碼如下。
  • 編寫 Makefile文件。
  • 執(zhí)行:make ,然后 sudo insmod globalmem.ko。
  • 驗(yàn)證:lsmod 可以看到該模塊,mknod /dev/globalmem c 354 0, echo ‘good global’ > /dev/globalmem, cat /dev/globalmem 可以看到輸出 good global; 還出現(xiàn)了:cat: /dev/globalmem: 沒有那個(gè)設(shè)備或地址,目前不知道是什么問題。
  • 測試:輸出如下: open/dev/globalmem successfully ,write successfully ,read successfully:mem。
  • 程序說明及實(shí)現(xiàn)

    一、內(nèi)核編譯提供以下實(shí)驗(yàn)的環(huán)境

  • uname -r查看內(nèi)核版本。如圖1所示。
  • 圖1 內(nèi)核版本 2. ls /usr/src,輸出。如圖2所示。 圖2 查看src目錄 3. 查看一下可一下載的源碼包(切記不要使用超級用戶使用此命令否則……會提示沒有此命令)執(zhí)行:apt-cache search linux-source。因?yàn)闄C(jī)房電腦的電腦已經(jīng)存在了編譯好的內(nèi)核因此這一步可以跳過。如圖3所示。 圖3查看源碼包(因?yàn)閍pt緩存沒有) 圖3 查看源碼包(因?yàn)閍pt緩存沒有) 4. 執(zhí)行:sudo apt-get install linux-source-4.10.0-19。如圖4所示。 圖4 sudo apt-get install結(jié)果圖 圖4 sudo apt-get install結(jié)果圖
  • 執(zhí)行:make oldconfig 。當(dāng)然你也可以使用 自己喜歡的配置方式 如 menuconfig , xconfig(必須有GTK環(huán)境吧),如圖5所示。之后,使用“l(fā)l”查看一下目錄,如圖6所示。。并且查看一下“.config”文件。如圖7所示。
  • 圖5 執(zhí)行“make config” 圖6 查看目錄” 圖7 “.config”文件”
  • 執(zhí)行:make bzImage。執(zhí)行結(jié)束后,可以看到在當(dāng)前目錄下生成了一個(gè)新的文件: vmlinux。如圖8所示。
  • 圖8 查看增加的vmlinux
  • 執(zhí)行:make modules和make modules_install,執(zhí)行結(jié)束之后,會在/lib/modules下生成新的目錄/lib/modules/3.13.0-32-generic/,若由于主機(jī)本身內(nèi)核版本就為3.13.0-32-generic,所以/lib/modules/3.13.0-32-generic/本身就存在,所以make modules和make modules_install兩步就不需要執(zhí)行了。
  • 內(nèi)核編譯結(jié)束,環(huán)境準(zhǔn)備工作完成。
  • 二、ubantu14.04 32 位下第一個(gè) hello world 驅(qū)動程序

  • 新建一個(gè)文件夾“test1”用來存放hello world 驅(qū)動程序相關(guān)文件。
  • 編寫hello.c文件以及Makefile文件。源代碼實(shí)驗(yàn)報(bào)告已經(jīng)提供,因此使用“vi”+文件名的方式創(chuàng)建文件并且將源代碼copy進(jìn)入到文件中,創(chuàng)建兩個(gè)文件如圖9所示。
  • 圖9 創(chuàng)建兩個(gè)文件

    ① 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占位符。

  • 在test1目錄下執(zhí)行“make”命令。效果如圖12所示。執(zhí)行“make”命令之后,查看當(dāng)前目錄下的文件,如圖13所示。
  • 圖12 執(zhí)行“make”效果 圖13 test1目錄下文件
  • 執(zhí)行sudo insmod ./hello.ko加載模塊。
  • 執(zhí)行l(wèi)smod就可以看到hello模塊。如圖14所示。
  • 圖14 加載hello模塊
  • 執(zhí)行“cat /var/log/syslog | grep world查看輸出”。如圖15所示。
  • 圖15 第一個(gè)hello world驅(qū)動程序最終效果圖

    三、 ubantu14.04 第二個(gè) memory 驅(qū)動程序

  • 新建一個(gè)文件夾“test2”用來存放memory 驅(qū)動程序相關(guān)文件。
  • 編寫mydm1.c文件以及Makefile文件。源代碼實(shí)驗(yàn)報(bào)告已經(jīng)提供,因此使用“vi”+文件名的方式創(chuàng)建文件并且將源代碼copy進(jìn)入到文件中,創(chuàng)建兩個(gè)文件
    如圖16所示。
  • 圖16 創(chuàng)建兩個(gè)文件
  • 編寫mydm1.c文件。如圖17所示。
  • 圖17 mydm1.c文件源代碼
  • 編寫 Makefile文件。如圖18所示。
  • 圖18 Makefile文件源代碼
  • 創(chuàng)建并編寫test.c文件用于測試。如圖19所示。
  • 圖19 test.c文件源代碼
  • 運(yùn)行:
    ①到包含 Makefile 和 mydm1.c 的目錄下執(zhí)行 make,生成 mydm1.ko,如圖20所示。并且使用“l(fā)l”查看當(dāng)前目錄可以看到相關(guān)文件,如圖21所示。
  • 圖20 執(zhí)行“make”命令效果 圖21 test2目錄

    ②執(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è)備

  • 新建一個(gè)文件夾“test3”用來存放globalmem 驅(qū)動程序相關(guān)文件。
  • 編寫globalmem.c文件以及Makefile文件。源代碼實(shí)驗(yàn)報(bào)告已經(jīng)提供,因此使用“vi”+文件名的方式創(chuàng)建文件并且將源代碼copy進(jìn)入到文件中,創(chuàng)建兩個(gè)文件如圖28所示。
  • 圖28 創(chuàng)建兩個(gè)文件
  • 編寫globalmem.c文件。如圖29所示。
  • 圖29 globalmem.c文件源代碼
  • 編寫 Makefile文件。如圖30所示。
  • 圖30 Makefile文件源代碼
  • 到包含 Makefile 和 globalmem.c 的目錄下執(zhí)行 make,生成 globalmem.ko,如圖31所示。
  • 圖31 執(zhí)行“make”命令
  • 執(zhí)行“sudo insmod globalmem.ko”加載模塊,如圖32所示。并且查看是否已加載成功,如圖33所示。
  • 圖32 執(zhí)行加載模塊 圖33 查看模塊globalmem是否加載成功
  • 驗(yàn)證:分別執(zhí)行 “mknod /dev/globalmem c 354 0”;“echo ‘hello global’ > /dev/globalmem”;“cat /dev/globalmem” 可以看到輸出“hello global”(自己改寫了內(nèi)容); 還出現(xiàn)了:cat: /dev/globalmem: 沒有那個(gè)設(shè)備或地址,目前不知道是什么問題。如圖34所示。
  • 圖34 驗(yàn)證結(jié)果
  • 測試:
    ① 創(chuàng)建并編寫test.c文件用于測試。如圖35,圖36所示。
  • 圖35 創(chuàng)建test.c文件 圖36 test.c文件源代碼

    ② 執(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ū)動程序

    圖39 第一個(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。