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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮

發布時間:2024/9/21 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息安全系统设计基础实验四:外设驱动程序设计 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

#include <stdio.h> #include <stdlib.h> #include <fcntl.h>//其中定義了很多宏和諸如open,close函數 #include <unistd.h> #include <sys/ioctl.h>//ioctl函數的頭文件void showbuf(char *buf); int MAX_LEN=32;int main() {int fd;int i;char buf[255];for(i=0; i<MAX_LEN; i++){//給數組元素依次賦值buf[i]=i;}fd=open("/dev/demo",O_RDWR);//以既可以讀又可以寫的方式打開文件if(fd < 0){printf("####DEMO device open fail####\n");return (-1);}printf("write %d bytes data to /dev/demo \n",MAX_LEN);showbuf(buf);//先顯示一下要寫入什么,然后寫入write(fd,buf,MAX_LEN);printf("Read %d bytes data from /dev/demo \n",MAX_LEN);read(fd,buf,MAX_LEN);showbuf(buf);//先讀出來字符串到buf中,再顯示ioctl(fd,1,NULL);ioctl(fd,4,NULL);close(fd);return 0;}void showbuf(char *buf) {int i,j=0;for(i=0;i<MAX_LEN;i++){if(i%4 ==0)printf("\n%4d: ",j++);printf("%4d ",buf[i]);}printf("\n*****************************************************\n"); }

這段代碼很簡單,然而會出現一個疑問: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祁玮的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。