Linux 内核编程实验报告4
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux内核分析实验报告
实验题目:动态模块设计实验
实验目的:学习模块,模块式linux特有的一种机制。模块可以动态地增加内核的功能。编写模块,将它作为linux内核空间的扩展。
硬件环境:内存1G以上
软件环境:Linux(Ubuntu) 2-6
实验步骤:
一:实验原理简介:
模块一旦被转载进系统,就会在系统态下运行。如果模块知道系统的数据结构地址,就可以读写相应的数据结构。模块作为一种抽象的数据类型,他有一个可以通过静态内核中断的接口。加入模块的每个新函数必须在该模块被装载到内核时进行注册。如果模块式静态装载的,加入模块的所有函数在内核启动时候进行注册。如果是动态装载的,必须在装载这个模块时候动态注册。注册工作在init_module() 中完成,注销工作是在cheanup_module()中完成。
对于模块的使用有两种方式。一种是设备驱动程序,一种是/proc文件。
本实验中要求从当前进程开始,首先追溯到init进程,显示出一路上经历的所有进程的进程号,进程名。然后从init进程开始,遍历所有的进程,显示进程名与进程号。前者主要是用到一个while循环,判断当前进程进程号是否是1,后者主要是用到一个宏定义for_each_process,遍历所有的进程。
二:主要数据结构:
1./proc下的文件(目录)结构:
struct proc_dir_entry {
unsigned int low_ino; /*目录入口的imod节点号 */
unsigned short namelen; /*节点名长度*/
const char *name; /*节点名*/
mode_t mode; /*节点的类型和权限*/
nlink_t nlink; /*节点的连接数*/
uid_t uid; /*拥有该节点的用户uid*/
gid_t gid; /*g拥有该节点的组gid*/
loff_t size;
/*节点的限制大小,除非限制长度,否则为 0*/ struct inode_operations * proc_iops;
/*对该节点的操作*/
const struct file_operations * proc_fops;
/*对该文件的操作*/
get_info_t *get_info; /*如果定义,当有读操作时候调用*/
struct module *owner; /*拥有该模块的用户*/
struct proc_dir_entry *next, *parent, *subdir;
/*节点间的关系,初始为NULL*/
void *data; /*节点对应文件的内容*/
read_proc_t *read_proc; /*读操作函数*/
write_proc_t *write_proc; /*写操作函数*/
atomic_t count; /* 节点引用计数 */ int deleted; /* 节点删除标志 */ void *set;
};
其中几个属性的设置为:
owner=THIS_MODULE;
data 指向文件数据区,自己定义
read_proc 指向读操作处理函数
write_proc 指向写操作处理函数
三:主要函数介绍
1:系统函数
(1)init_module()
函数说明:系统调用装载模块
(2)cleanup_module()
函数说明:清除模块。
(3)int sprintf(string format, mixed [args]...)
函数说明:将args各个函数的参数整合到format字符串中。
四:程序流程:
进程初始化过程当中,我们将进程的信息,整合到mydata 数据结构当中,然后输出:
具体内容包括:
从当前进程开始向上遍历,直至进程号为1结束(81行—85行):
用宏调用for_each_process从init开始逐个遍历进程,同样的方式将将进程的信息追加到mydata数据结构。(90行
—95行)
(见图3--1)
(图3--1)
五:结果检测:
编译模块:进入程序所在的目录,键入make命令
安装模块:sudo install shiyan.ko
测试结果:lsmod
显示结果是
正确,说明模块被正确加载
进入/proc/mydir下查看myfile文件内容:
结果见图3--2
(图3—2 )
(正确)
结论分析与体会:
模块是系统中一个重要的组成部分,其中涉及到设备驱动的相关内容,本试验的内容相对比较简单,但是却为以后的实验,甚至将来的内核编程奠定的基础。
附:程序源代码
/******************************************************************** *****
**
/******************************************************************** *******
main.c - description
begin : 4 4 21:01:11 CST 2003
copyright : (C) 2003 by 张鸿烈
Function : 编写创建proc文件系统的模块,该程序创建在/proc目录下
: 创建mydir目录, 在mydir目录下创建保存当前的系统时间
jiffies值的文件 myfile,
********************************************************************* ******/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MODULE_NAME "Myproc"
#define MYDATA_LEN 8192
// 放用户空间传入的数据
struct my_proc_data{
char value[MYDATA_LEN];
};
struct my_proc_data mydata;
struct task_struct *task;
int count;
static struct proc_dir_entry *example_dir;
static struct proc_dir_entry *date_file;
static int param;
char temp[15];
module_param(param, int , 0644);
//读文件myfile 的读驱动函数
static int proc_read(char *page, char **start,off_t off,int count,int *eof,void *data ){
int len=0;
struct my_proc_data *mydatap = (struct my_proc_data *) data;
len+=sprintf(page,"%s%ld\n",mydatap->value,jiffies); //将字符串格