Linux 内核编程实验报告4

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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); //将字符串格

相关文档
最新文档