信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮
北京電子科技學(xué)院(BESTI)
實 驗 報 告
封 面
課程:信息安全系統(tǒng)設(shè)計基礎(chǔ) 班級:1452 姓名: 黃亞奇 祁瑋
學(xué)號: 20145222 20145213 成績: 指導(dǎo)教師:婁嘉鵬 實驗日期:2016.11.24
實驗密級: 預(yù)習(xí)程度: 實驗時間:10:10-12:30 儀器組次:22 必修/選修:必修 實驗序號:4
實驗名稱: 外設(shè)驅(qū)動程序設(shè)計
實驗?zāi)康呐c要求:
1.在掌握基于 S3C2410 的 linux 開發(fā)環(huán)境的配置和使用的基礎(chǔ)上進行交叉編譯。
2.理解驅(qū)動程序的一般設(shè)計方法。
3.正確使用連接線等實驗儀器,并注意保護實驗箱。實驗結(jié)束之后將實驗箱送回。
正文
一、實驗內(nèi)容:
本次實驗建立在掌握嵌入式開發(fā)平臺使用方法和配置方法的基礎(chǔ)上,要求使用windows xp,linux(red hat),arm三個系統(tǒng)(即NFS方式);在linux系統(tǒng)中安裝arm系統(tǒng),然后對01_demo文件夾中的.c文件進行交叉編譯。
二、實驗原理
目的:驅(qū)動程序是應(yīng)用程序和硬件之間的一個軟件層,為(許多個)應(yīng)用程序提供硬件的所有功能。為了處理并發(fā)的情況,還需要考慮互斥量和鎖等機制。
特點:應(yīng)用程序一般有一個 main 函數(shù),從頭到尾執(zhí)行一個任務(wù);驅(qū)動程序卻不同,它沒有main函數(shù),通過使用宏module_init(初始化函數(shù)名)。
用法:將初始化函數(shù)加入內(nèi)核全局初始化函數(shù)列表中,在內(nèi)核初始化時執(zhí)行驅(qū)動的初始化函數(shù),從而完成驅(qū)動的初始化和注冊,之后驅(qū)動便停止等待被應(yīng)用軟件調(diào)用。驅(qū)動程序中有一個宏moudule_exit(退出處理函數(shù)名)注冊退出處理函數(shù)。它在驅(qū)動退出時被調(diào)用。
主要代碼
test_demo.c
這段代碼很簡單,然而會出現(xiàn)一個疑問:write函數(shù)、read函數(shù)在哪里定義的?ioctl函數(shù)優(yōu)勢做什么的?于是我接下來查看了實驗指導(dǎo)書的原理部分和demo.c代碼。
其實,上面這段代碼中出現(xiàn)的函數(shù)都在demo.c代碼中有了定義。比如,ioctl函數(shù)的定義(嚴格說來,驅(qū)動程序里定義的是方法):
static int demo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){printk("ioctl runing\n");switch(cmd){case 1:printk("runing command 1 \n");break;case 2:printk("runing command 2 \n");break;default:printk("error cmd number\n");break;}return 0;}ioctl 方法主要用于對設(shè)備進行讀寫之外的其他控制,比如配置設(shè)備、進入或退出某種 操作模式,這些操作一般都無法通過read/write 文件操作來完成。
三、實驗過程&困難排查
配置實驗箱
同實驗一中一樣,配置實驗環(huán)境連接arm開發(fā)板;
建立超級終端;
啟動實驗平臺;
修改windows xp系統(tǒng)的ip使得它與arm機的ip在同一網(wǎng)段;
在red hat中安裝arm編譯器;
配置環(huán)境變量。
進入01_demo文件夾中,嘗試直接make進行自動編譯。出現(xiàn)如下圖所示的錯誤。
按照指導(dǎo)書的提示,進行如下操作建立linux連接:
cd /usr/src/ln -sf linux-2.4.20-8 linuxls(結(jié)果)debug linux linux-2.4 linux-2.4.20-8 redhat
然而,仍然出現(xiàn)上圖的錯誤。
這時,嘗試按照如下內(nèi)容修改01_demo文件夾中的Makefile
KERNELDIR = /usr/src/linux #KERNELDIR = /arm2410cl/ kernel/linux-2.4.18-2410cl/ INCLUDEDIR = $(KERNELDIR)/include #CROSS_COMPILE=armv41-unknown-linux- AS =$(CROSS_COMPILE)as LD =$(CROSS_COMPILE)ld CC =$(CROSS_COMPILE)gcc CPP =$(CC) -E AR =$(CROSS_COMPILE)ar NM =$(CROSS_COMPILE)nm STRIP =$(CROSS_COMPILE)strip OBJCOPY =$(CROSS_COMPILE)objcopy OBJDUMP =$(CROSS_COMPILE)objdump CFLAGS += -I.. CFLAGS += -Wall -O -D__KERNEL__ -DMODULE -I$(INCLUDEDIR) TARGET = demo OBJS = demo.o hello.o SRC = demo.c hello.c all: $(OBJS) demo.o: demo.c $(CC) -c $(CFLAGS) $^ -o $@ hello.o:hello.c $(CC) -c $(CFLAGS) $^ -o $@ install: install -d $(INSTALLDIR) install -c $(TARGET).o $(INSTALLDIR) clean: rm -f *.o *~ core .depend再次進行make之后,系統(tǒng)不再提示錯誤。然而少了最后對于testdemo.c的編譯。于是,我們進行了手動編譯。最后執(zhí)行./testdemo.
四、實驗中遇到的疑惑和困難
內(nèi)核地址不正確導(dǎo)致調(diào)試不成功,使用命令“whereis”尋找到內(nèi)核地址為:
/usr/src/linux-headers-3.2.0-29-generic-pae/kernel # /lib/modules/$(shell uname -r)/build/
轉(zhuǎn)載于:https://www.cnblogs.com/huangyaqi/p/6130612.html
總結(jié)
以上是生活随笔為你收集整理的信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 greenDao 框架 操作数据库
- 下一篇: MySQL查询数据操作(DQL)