北京電子科技學院(BESTI)linux
實 驗 報 告shell
課程:信息安全系統設計基礎 班級: 1352班 安全
姓名:(按貢獻大小排名)馬悅、益西拉姆、銀雪純併發
學號:(按貢獻大小排名)2013523五、2013523九、20125221編輯器
成績: 指導教師:婁嘉鵬 實驗日期:2015.12.1函數
實驗密級: 預習程度: 實驗時間:15:30—18:00工具
儀器組次: 必修/選修:必修 實驗序號:四學習
實驗名稱:內核驅動設計入門-模塊方式驅動實驗測試
實驗目的與要求:優化
一、學習在 LINUX 下進行驅動設計的原理。
二、掌握使用模塊方式進行驅動開發調試的過程。
實驗儀器:
名稱 |
型號 |
數量 |
計算機 |
|
1 |
嵌入式開發平臺 |
UP-NETARM2410-CL |
1 |
1、實驗內容
在 PC 機上編寫簡單的虛擬硬件驅動程序並進行調試,實驗驅動的各個接口函數的實現,分析並理解驅動與應用程序的交互過程。
2、實驗原理
Linux 中的驅動設計是嵌入式Linux 開發中十分重要的部分,它要求開發者不只要熟悉Linux 的內核機制、驅動程序與用戶級應用程序的接口關係、考慮系統中對設備的併發操做等等,並且還要很是熟悉所開發硬件的工做原理。這對驅動開發者提出了比較高的要求,這個實驗主要是給你們進入驅動設計提供一個簡單入門的一個實例,並不須要提供太多與硬件相關的內容,這部分應該是經過仔細閱讀芯片廠家提供的資料來解決。
驅動程序的做用是應用程序與硬件之間的一箇中間軟件層,驅動程序應該爲應用程序展示硬件的全部功能,不該該強加其餘的約束,對於硬件使用的權限和限制應該由應用程序層控制。可是有時驅動程序的設計是跟所開發的項目相關的,這時就可能在驅動層加入一些與應用相關的設計考慮,主要是由於在驅動層的效率比應用層高,同時爲了項目的須要可能只強化或優化硬件的某個功能,而弱化或關閉其餘一些功能;到底須要展示硬件的哪些功能全都由開發者根據須要而定。驅動程序有時會被多個進程同時使用,這時咱們要考慮如何處理併發的問題,就須要調用一些內核的函數使用互斥量和鎖等機制。
驅動程序主要須要考慮下面三個方面:提供儘可能多的選項給用戶,提升驅動程序的速度和效率,儘可能使驅動程序簡單,使之易於維護。
Linux 的驅動開發調試有兩種方法,一種是直接編譯到內核,再運行新的內核來測試;二是編譯爲模塊的形式,單獨加載運行調試。第一種方法效率較低,但在某些場合是惟一的方法。模塊方式調試效率很高,它使用insmod 工具將編譯的模塊直接插入內核,若是出現故障,可使用rmmod 從內核中卸載模塊。不須要從新啓動內核,這使驅動調試效率大大提升。咱們的實驗在PC 機和UP-TECH S2410/P270 DVP 上均可以運行,編譯時使用不一樣的編譯器就能夠了。
3、實驗步驟
1、閱讀和理解源代碼
進入/arm2410cl/exp/drivers/01_demo,使用vi 編輯器或其餘編輯器閱讀理解源代碼。
2、編譯驅動模塊及測試程序
上面介紹了在 Makefile 中有兩種編譯方法,能夠在本機上使用gcc 也可使用交叉編譯器進行編譯,這裏咱們只介紹用交叉編譯器進行編譯的結果。
注意:若是編譯的時候出現問題,多是在/usr/src 下沒有創建一個linux 鏈接,可使用下面的命令:
[root@zxt 01_demo]# cd /usr/src/
[root@zxt src]# ln -sf linux-2.4.20-8 linux
[root@zxt src]# ls
debug linux linux-2.4 linux-2.4.20-8 redhat
3、測試驅動程序
若是使用 gcc 編譯的話,須要經過下面的命令來創建設備節點,若是使用交叉編譯器的話,不須要創建設備節點。
#mknod /dev/demo c 254 0
首先要插入驅動模塊demo.o,而後能夠用lsmod 命令來查看模塊是否已經被插入,在不使用該模塊的時候還能夠用rmmod 命令來將模塊卸載。
[root@zxt 01_demo]# insmod demo.o
Warning: loading demo.o will taint the kernel: no license
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Module demo loaded, with warnings
下面使用測試程序來進行測試,按照上面步驟成功後會出現下面的結果:
[root@zxt 01_demo]# ./test_demo
write 32 bytes data to /dev/demo
0: 0 1 2 3
1: 4 5 6 7
2: 8 9 10 11
3: 12 13 14 15
4: 16 17 18 19
5: 20 21 22 23
6: 24 25 26 27
7: 28 29 30 31
*****************************************************
Read 32 bytes data from /dev/demo
0: 31 30 29 28
1: 27 26 25 24
2: 23 22 21 11
3: 12 13 14 15
4: 16 17 18 19
5: 20 10 9 8
6: 7 6 5 4
7: 3 2 1 0
*****************************************************
若是模塊沒有成功插入的話,會出現下面的狀況:
[root@zxt 01_demo]# ./test_demo
####DEMO device open fail####
在驅動模塊成功插入後,會在/dev 下面創建一個叫作demo 的設備文件,咱們也可使用cat 命令來直接調用read 函數,來測試讀過程。
[root@zxt demo]# cat /dev/demo/0
device open success!
4、實驗體會
一、實驗中遇到的問題和解決方案
內核地址不正確致使調試不成功,使用命令「whereis」尋找到內核地址爲:/usr/src/linux-headers-3.2.0-29-generic-pae/kernel # /lib/modules/$(shell uname -r)/build/
二、體會
本次實驗爲模塊方式驅動,由於本次實驗沒有要求編寫代碼,只要求讀懂代碼並對其進行調試,故進行比較順利。雖然調試過程當中出現了一些問題,但在同窗的幫助下將問題順利解決了。對本次實驗的代碼研究的還不是特別深刻,但在之後的學習中,定會將其深刻理解。