实验三-添加内核模块_第1页
实验三-添加内核模块_第2页
实验三-添加内核模块_第3页
实验三-添加内核模块_第4页
实验三-添加内核模块_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.实验三 添加内核模块一、实验目的:学习Linux模块的基本概念和原理,学习内核模块编程的基本技术,利用内核模块编程访问进程描述符,操作内核的基本数据结构,加深对进程的理解;理解proc文件系统的作用,学习proc文件的创建方法,掌握这种用户态和核心态通信的方法。二、实验平台:虚拟机:VMWare9操作系统:Ubuntu12.04编辑器:Gedit | Vi三、实验内容:(1)阅读内核模块实例hello.c,掌握内核模块的主要构成;阅读Makefile文件,理解内核模块的编译方法及执行过程;掌握模块安装、卸载,以及查看模块信息的方法。查看模块信息:卸载模块:(2)设计一个模块,功能是列出系统中

2、所有内核进程的程序名、PID号和进程状态。主要步骤:阅读内核源代码,了解进程描述符task_struct中与本实验有关的成员项,以及访问进程队列的宏for_each_process;编写readprocess模块,获取进程信息;修改Makefile文件,编译、安装模块,查看输出信息;查看模块信息,卸载模块。readprocess.c:#include #include #include #include #include / 初始化函数static int hello_init(void) struct task_struct *p; p = NULL; p = &init_task; pri

3、ntk(KERN_ALERT名称t进程号t状态t优先级t父进程号t); for_each_process(p) if(p-mm = NULL) /内核线程的mm成员为空 printk(KERN_ALERT%st%dt%ldt%dn,p-comm,p-pid, p-state,p-normal_prio,p-parent-pid); return 0;/ 清理函数static void hello_exit(void) printk(KERN_ALERTgoodbye!n);/ 函数注册module_init(hello_init); module_exit(hello_exit); / 模块许

4、可申明MODULE_LICENSE(GPL);Makefile代码:ifneq ($(KERNELRELEASE),)obj-m:=readprocess.oelseKDIR:= /lib/modules/$(shell uname -r)/buildPWD:= $(shell pwd)default:$(MAKE) -C $(KDIR) M=$(PWD) modulesclean:$(MAKE) -C $(KDIR) M=$(PWD) cleanendif将process.c和Makefile文件放在同一个文件夹下使用make函数生成后缀为.ko文件:使用命令载入模块,如图:使用lsmod命

5、令显示载入系统的模块,如图:(3)利用内核模块编程,在/proc目录下用自己的学号创建一个目录,如/proc/201300834101然后在学号目录下创建一个processinfo文件,如/proc/201300834101/processinfo,此文件为只读文件,用于显示所有内核进程的程序名、PID号和进程状态。主要步骤:修改(2)中readprocess模块,在模块初始化函数中创建目录及proc文件,并定义产生proc文件内容的函数(获取进程信息);在卸载模块函数中删除相应的proc文件及目录;修改Makefile文件,编译、安装模块;Processinfo.c:#include / 初

6、始化模块#include / 创建进程信息入口#include / 初始进程#include / 序列文件#include / 内存分配释放 #include /下一个进程char modname = 201608030317;struct task_struct *task;int taskcounts=0;/ 全局进程变量static void * my_seq_start(struct seq_file *m, loff_t *pos) /printk(KERN_INFOInvoke startn); /可以输出调试信息 if ( *pos = 0 ) / 表示遍历开始 task = &

7、init_task;/遍历开始的记录地址 return &task; /返回一个非零值表示开始遍历 else /遍历过程中 if (task = &init_task ) /重新回到初始地址,退出 return NULL; return (void*)pos;/否则返回一个非零值 static int my_seq_show(struct seq_file *m, void *v)/获取进程的相关信息 /printk(KERN_INFOInvoke shown); seq_printf( m, #%-3dt , taskcounts ); /输出进程序号 seq_printf( m, %dt,

8、 task-pid );/输出进程pid seq_printf( m, %lut , task-state );/输出进程state seq_printf( m, %st , task-comm );/输出进程名称(comm) seq_puts( m, n ); return 0; static void * my_seq_next(struct seq_file *m, void *v, loff_t *pos) /printk(KERN_INFOInvoke nextn); (*pos)+; /task指向下一个进程? taskcounts+; task= next_task(task);

9、 /指向下一个进程 return NULL;static void my_seq_stop(struct seq_file *m, void *v)/printk(KERN_INFOInvoke stopn);/ do nothing static struct seq_operations my_seq_fops = /序列文件记录操作函数集合 .start = my_seq_start, .next = my_seq_next, .stop = my_seq_stop, .show = my_seq_show;static int my_open(struct inode *inode,

10、struct file *file) return seq_open(file, &my_seq_fops); /打开序列文件并关联my_seq_fops static const struct file_operations my_proc = /proc文件操作函数集合.owner = THIS_MODULE, .open = my_open,.read = seq_read, .llseek = seq_lseek,.release = seq_release ; int _init my_init( void )struct proc_dir_entry* my_proc_entry;

11、printk( nInstalling %s modulen, modname );my_proc_entry = proc_create(modname, 0x644, NULL, &my_proc);/生成proc文件if (NULL = my_proc_entry) return -ENOMEM;return0; /SUCCESSvoid _exit my_exit( void )remove_proc_entry( modname, NULL );/删除proc文件printk( Removing %s modulen, modname );module_init(my_init);m

12、odule_exit(my_exit);MODULE_LICENSE(GPL); Makefile代码:ifneq ($(KERNELRELEASE),)obj-m:=readprocess.oelseKDIR:= /lib/modules/$(shell uname -r)/buildPWD:= $(shell pwd)default:$(MAKE) -C $(KDIR) M=$(PWD) modulesclean:$(MAKE) -C $(KDIR) M=$(PWD) cleanendif将processinfo.c和Makefile文件放在同一个文件夹下使用make函数生成后缀为.ko文件:查看模块是否存在:使用dmesg命令查看到系统的内核模块信息,如图:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论