信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮
北京電子科技學院(BESTI)
實 驗 報 告
封 面
課程:信息安全系統設計基礎 班級:1452 姓名: 黃亞奇 祁瑋
學號: 20145222 20145213 成績: 指導教師:婁嘉鵬 實驗日期:2016.11.24
實驗密級: 預習程度: 實驗時間:10:10-12:30 儀器組次:22 必修/選修:必修 實驗序號:4
實驗名稱: 外設驅動程序設計
實驗目的與要求:
1.在掌握基于 S3C2410 的 linux 開發環境的配置和使用的基礎上進行交叉編譯。
2.理解驅動程序的一般設計方法。
3.正確使用連接線等實驗儀器,并注意保護實驗箱。實驗結束之后將實驗箱送回。
正文
一、實驗內容:
本次實驗建立在掌握嵌入式開發平臺使用方法和配置方法的基礎上,要求使用windows xp,linux(red hat),arm三個系統(即NFS方式);在linux系統中安裝arm系統,然后對01_demo文件夾中的.c文件進行交叉編譯。
二、實驗原理
目的:驅動程序是應用程序和硬件之間的一個軟件層,為(許多個)應用程序提供硬件的所有功能。為了處理并發的情況,還需要考慮互斥量和鎖等機制。
特點:應用程序一般有一個 main 函數,從頭到尾執行一個任務;驅動程序卻不同,它沒有main函數,通過使用宏module_init(初始化函數名)。
用法:將初始化函數加入內核全局初始化函數列表中,在內核初始化時執行驅動的初始化函數,從而完成驅動的初始化和注冊,之后驅動便停止等待被應用軟件調用。驅動程序中有一個宏moudule_exit(退出處理函數名)注冊退出處理函數。它在驅動退出時被調用。
主要代碼
test_demo.c
這段代碼很簡單,然而會出現一個疑問:write函數、read函數在哪里定義的?ioctl函數優勢做什么的?于是我接下來查看了實驗指導書的原理部分和demo.c代碼。
其實,上面這段代碼中出現的函數都在demo.c代碼中有了定義。比如,ioctl函數的定義(嚴格說來,驅動程序里定義的是方法):
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 方法主要用于對設備進行讀寫之外的其他控制,比如配置設備、進入或退出某種 操作模式,這些操作一般都無法通過read/write 文件操作來完成。
三、實驗過程&困難排查
配置實驗箱
同實驗一中一樣,配置實驗環境連接arm開發板;
建立超級終端;
啟動實驗平臺;
修改windows xp系統的ip使得它與arm機的ip在同一網段;
在red hat中安裝arm編譯器;
配置環境變量。
進入01_demo文件夾中,嘗試直接make進行自動編譯。出現如下圖所示的錯誤。
按照指導書的提示,進行如下操作建立linux連接:
cd /usr/src/ln -sf linux-2.4.20-8 linuxls(結果)debug linux linux-2.4 linux-2.4.20-8 redhat
然而,仍然出現上圖的錯誤。
這時,嘗試按照如下內容修改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之后,系統不再提示錯誤。然而少了最后對于testdemo.c的編譯。于是,我們進行了手動編譯。最后執行./testdemo.
四、實驗中遇到的疑惑和困難
內核地址不正確導致調試不成功,使用命令“whereis”尋找到內核地址為:
/usr/src/linux-headers-3.2.0-29-generic-pae/kernel # /lib/modules/$(shell uname -r)/build/
轉載于:https://www.cnblogs.com/huangyaqi/p/6130612.html
總結
以上是生活随笔為你收集整理的信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 greenDao 框架 操作数据库
- 下一篇: 微信小程序电商系统省市区选择器(二)