信息安全系统设计基础实验四

北京电子科技学院(BESTI)

             

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

              姓名:(按贡献大小排名)马悦、益西拉姆、银雪纯

              学号:(按贡献大小排名)20135235、20135239、20125221

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

              实验密级:        预习程度:        实验时间:15:30—18:00

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

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

              实验目的与要求:

              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!

四、实验体会

1、实验中遇到的问题和解决方案

  内核地址不正确导致调试不成功,使用命令“whereis”寻找到内核地址为:/usr/src/linux-headers-3.2.0-29-generic-pae/kernel # /lib/modules/$(shell uname -r)/build/

2、体会

  本次实验为模块方式驱动,因为本次实验没有要求编写代码,只要求读懂代码并对其进行调试,故进行比较顺利。虽然调试过程中出现了一些问题,但在同学的帮助下将问题顺利解决了。对本次实验的代码研究的还不是特别深入,但在以后的学习中,定会将其深入理解。

posted @ 2015-12-02 16:00  20135235马悦  阅读(377)  评论(0编辑  收藏  举报