北京电子科技学院(BESTI)linux
实 验 报 告shell
课程:信息安全系统设计基础 班级: 1352班 安全
姓名:(按贡献大小排名)马悦、益西拉姆、银雪纯并发
学号:(按贡献大小排名)2013523五、2013523九、20125221编辑器
成绩: 指导教师:娄嘉鹏 实验日期:2015.12.1函数
实验密级: 预习程度: 实验时间:15:30—18:00工具
仪器组次: 必修/选修:必修 实验序号:四学习
实验名称:内核驱动设计入门-模块方式驱动实验测试
实验目的与要求:优化
一、学习在 LINUX 下进行驱动设计的原理。
二、掌握使用模块方式进行驱动开发调试的过程。
实验仪器:
名称 |
型号 |
数量 |
计算机 |
|
1 |
嵌入式开发平台 |
UP-NETARM2410-CL |
1 |
1、实验内容
在 PC 机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。
2、实验原理
Linux 中的驱动设计是嵌入式Linux 开发中十分重要的部分,它要求开发者不只要熟悉Linux 的内核机制、驱动程序与用户级应用程序的接口关系、考虑系统中对设备的并发操做等等,并且还要很是熟悉所开发硬件的工做原理。这对驱动开发者提出了比较高的要求,这个实验主要是给你们进入驱动设计提供一个简单入门的一个实例,并不须要提供太多与硬件相关的内容,这部分应该是经过仔细阅读芯片厂家提供的资料来解决。
驱动程序的做用是应用程序与硬件之间的一个中间软件层,驱动程序应该为应用程序展示硬件的全部功能,不该该强加其余的约束,对于硬件使用的权限和限制应该由应用程序层控制。可是有时驱动程序的设计是跟所开发的项目相关的,这时就可能在驱动层加入一些与应用相关的设计考虑,主要是由于在驱动层的效率比应用层高,同时为了项目的须要可能只强化或优化硬件的某个功能,而弱化或关闭其余一些功能;到底须要展示硬件的哪些功能全都由开发者根据须要而定。驱动程序有时会被多个进程同时使用,这时咱们要考虑如何处理并发的问题,就须要调用一些内核的函数使用互斥量和锁等机制。
驱动程序主要须要考虑下面三个方面:提供尽可能多的选项给用户,提升驱动程序的速度和效率,尽可能使驱动程序简单,使之易于维护。
Linux 的驱动开发调试有两种方法,一种是直接编译到内核,再运行新的内核来测试;二是编译为模块的形式,单独加载运行调试。第一种方法效率较低,但在某些场合是惟一的方法。模块方式调试效率很高,它使用insmod 工具将编译的模块直接插入内核,若是出现故障,可使用rmmod 从内核中卸载模块。不须要从新启动内核,这使驱动调试效率大大提升。咱们的实验在PC 机和UP-TECH S2410/P270 DVP 上均可以运行,编译时使用不一样的编译器就能够了。
3、实验步骤
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!
4、实验体会
一、实验中遇到的问题和解决方案
内核地址不正确致使调试不成功,使用命令“whereis”寻找到内核地址为:/usr/src/linux-headers-3.2.0-29-generic-pae/kernel # /lib/modules/$(shell uname -r)/build/
二、体会
本次实验为模块方式驱动,由于本次实验没有要求编写代码,只要求读懂代码并对其进行调试,故进行比较顺利。虽然调试过程当中出现了一些问题,但在同窗的帮助下将问题顺利解决了。对本次实验的代码研究的还不是特别深刻,但在之后的学习中,定会将其深刻理解。