信息安全系统设计基础 实验四:外社驱动程序设计 20135327郭皓 20135329 李海空
北京电子科技学院(BESTI)
实 验 报 告
课程:信息安全设计基础 班级:1353
姓名:郭皓 李海空
学号:20135327 20135329
成绩: 指导教师:娄嘉鹏 实验日期:2015.11.17
实验密级: 预习程度: 实验时间:15:30~18:00
仪器组次: 必修/选修: 实验序号:4
实验名称: 实验四:外社驱动程序设计
实验目的与要求:学习在Linux下进行驱动设计的原理
掌握使用模块方式进行驱动开发调试的过程
实验仪器:
名称 |
型号 |
数量 |
ARM实验箱 |
|
1 |
PC |
|
1 |
实验内容、步骤与体会:
- 导入并编译驱动模块及测试代码
2、测试驱动程序
- 实验过程的理解,实验指导书中知识点的理解。
(1) 为什么需要交叉编译?如何安装交叉编译环境?
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。 简单地说,就是在一个平台上生成另一个平台上的可执行代码。
简言之,因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
(2) Linux 的驱动开发调试有两种方法
一种是直接编译到内核,再运行新的内核来测试;二是编译为模块的形式,单独加载运行调试。第一种方法效率较低,但在某些场合是唯一的方法。模块方式调试效率很高,它使用 insmod 工具将编译的模块直接插入内核,如果出现故障,可以使用 rmmod 从内核中卸载模块。不需要重新启动内核,这使驱动调试效率大大提高。
(3) 驱动程序与应用程序的区别
应用程序一般有一个 main 函数, 从头到尾执行一个任务; 驱动程序却不同,它没有 main 函数,通过使用宏 module_init(初始化函数名); 将初始化函数加入内核全局初始化函数列表中,在内核初始化时执行驱动的初始化函数,从而完成驱动的初始化和注册,之后驱动便停止等待被应用软件调用。驱动程序中有一个宏 moudule_exit(退出处理函数名)注册退 出处理函数。它在驱动退出时被调用。
应用程序可以和 GLIBC 库连接,因此可以包含标准的头文件,比如<stdio.h> <stdlib.h>,在驱动程序中是不能使用标准 C 库的,因此不能调用所有的 C 库函数,比如输出打印函数只能使用内核的 printk 函数,包含的头文件只能是内核的头文件,比如 <linux/module.h>。
- 实验过程中遇到的问题以及解决方案。
(1) 无法make编译代码问题。
解决:用Vi在Makefile中重新设置路径,因为给的代码路径和实际路径有冲突,导致编译不成功,具体如图: