• 实验四


    北京电子科技学院(BESTI)

                  

                  课程:信息安全系统设计基础                  班级: 1453班             

                  姓名:彭垚

                  学号:20145317

                  成绩:            指导教师:娄嘉鹏            实验日期:

                  实验密级:        预习程度:        实验时间:

                  仪器组次:        必修/选修:必修            实验序号:四

                  实验名称:内核驱动设计入门-模块方式驱动实验

                  实验目的与要求:

                  1、学习在 LINUX 下进行驱动设计的原理。

                  2、掌握使用模块方式进行驱动开发调试的过程。

                  实验仪器:

    名称

    型号

    数量

    计算机

     

    1

    嵌入式开发平台

    UP-NETARM2410-CL

    1

    一、实验内容

       在 PC 机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。

    二、实验原理

       Linux 中的驱动设计是嵌入式Linux 开发中十分重要的部分,它要求开发者不仅要熟悉Linux 的内核机制、驱动程序与用户级应用程序的接口关系、考虑系统中对设备的并发操作等等,而且还要非常熟悉所开发硬件的工作原理。这对驱动开发者提出了比较高的要求,这个实验主要是给大家进入驱动设计提供一个简单入门的一个实例,并不需要提供太多与硬件相关的内容,这部分应该是通过仔细阅读芯片厂家提供的资料来解决。

       驱动程序的作用是应用程序与硬件之间的一个中间软件层,驱动程序应该为应用程序展现硬件的所有功能,不应该强加其他的约束,对于硬件使用的权限和限制应该由应用程序层控制。但是有时驱动程序的设计是跟所开发的项目相关的,这时就可能在驱动层加入一些与应用相关的设计考虑,主要是因为在驱动层的效率比应用层高,同时为了项目的需要可能只强化或优化硬件的某个功能,而弱化或关闭其他一些功能;到底需要展现硬件的哪些功能全都由开发者根据需要而定。驱动程序有时会被多个进程同时使用,这时我们要考虑如何处理并发的问题,就需要调用一些内核的函数使用互斥量和锁等机制。

       驱动程序主要需要考虑下面三个方面:提供尽量多的选项给用户,提高驱动程序的速度和效率,尽量使驱动程序简单,使之易于维护。

       Linux 的驱动开发调试有两种方法,一种是直接编译到内核,再运行新的内核来测试;二是编译为模块的形式,单独加载运行调试。第一种方法效率较低,但在某些场合是唯一的方法。模块方式调试效率很高,它使用insmod 工具将编译的模块直接插入内核,如果出现故障,可以使用rmmod 从内核中卸载模块。不需要重新启动内核,这使驱动调试效率大大提高。我们的实验在PC 机和UP-TECH S2410/P270 DVP 上都可以运行,编译时使用不同的编译器就可以了。

    三、实验步骤

    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!

  • 相关阅读:
    php主要输出方式的区别
    文件操作
    会话
    Jquery常用函数及功能
    AJAX
    php 审核注册
    转载图片上传预览 代码
    php笔记-图片上传
    php 练习题-session与 cookie的 取值赋值
    php学习笔记-会话控制简单介绍session和cookie(一)
  • 原文地址:https://www.cnblogs.com/5317p/p/6083359.html
Copyright © 2020-2023  润新知