zoukankan      html  css  js  c++  java
  • 20145212&20145204信息安全系统实验四报告

    一、实验内容与步骤

    1.本次实验建立在掌握嵌入式开发平台使用方法和配置方法的基础上,要求使用windows xp,linux(red hat),arm三个系统(即NFS方式);
    2.在linux系统中安装arm系统,然后对01_demo文件夹中的.c文件进行交叉编译。
    3.阅读和理解源代码:进入/arm2410cl/exp/drivers/01_demo,使用vim编辑器或其他编辑器阅读理解源代码。
    4.编译驱动模块及测试程序

    • 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
    

    5.测试驱动程序

    • 若使用 gcc 编译,需要通过命令#mknod /dev/demo c 254 0来建立设备节点,如果使用交叉编译器的话,不需要建立设备节点。

    二、实验原理

    驱动程序

    • 目的:驱动程序是应用程序和硬件之间的一个软件层,为(许多个)应用程序提供硬件的所有功能。为了处理并发的情况,还需要考虑互斥量和锁等机制。
    • 特点:应用程序一般有一个 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####
    ");
                return (-1);
            }
            printf("write %d bytes data to /dev/demo 
    ",MAX_LEN);
            showbuf(buf);//先显示一下要写入什么,然后写入
            write(fd,buf,MAX_LEN);
    
            printf("Read %d bytes data from /dev/demo 
    ",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("
    %4d: ",j++);
                printf("%4d ",buf[i]);
            }
            printf("
    *****************************************************
    ");
        }
    

    三、实验过程与结果

    • 1.配置实验箱
    配置实验环境、连接arm开发板、建立超级终端、启动实验平台、修改windows xp系统的ip使得它与arm机的ip在同一网段、在red hat中安装arm编译器、配置环境变量
    
    • 2.进入01_demo文件夹中,尝试直接make进行自动编译。出现错误。
    • 3.修改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的方法,但是实际上应该先用GCC编译,补上相关语句,修改MAKEFILE即可。
    • 最终成功的结果截图如下:
  • 相关阅读:
    多文件编程(day13)
    字符串函数(day11)
    字符编码
    逻辑公式相等的自动证明
    排列组合问题之圆形分布
    排列组合之线性排列
    分金条
    进制的意义和算法
    集合的异或运算(对称差)
    集合习题之列出有限集合所有子集
  • 原文地址:https://www.cnblogs.com/alovera/p/6105574.html
Copyright © 2011-2022 走看看