《编写proc文件系统相关的内核模块设计.doc》由会员分享,可在线阅读,更多相关《编写proc文件系统相关的内核模块设计.doc(7页珍藏版)》请在三一办公上搜索。
1、Linux课程设计报告 学院:信息学院 专业班级:08级网络二班 姓名: 学号: 【实验目的】1.通过课程设计对操作系统基本原理进行更深入的认识,以Linux为具体研究对象,分析理解操作系统底层实现,综合利用已学知识与技术,就Linux操作系统各功能方面进行模拟或实现2.了解内核模块结构3.熟练内核模块编程,练习使用makefile【实验要求】编写proc文件系统相关的内核模块:设计一个模块,该模块功能是列出系统中所有内核线程的程序名、PID号和进程状态。再设计一个带参数的模块,参数为进程的PID号,功能是列出进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID号。【实验步骤】1. 编
2、写list.c模块2. 编写Makefile3. make编译模块4. 安装模块sudo insmod list.ko5. 查看系统信息dmesg6. 退出模块sudo rmmod list7. 编写list2.c模块8. 编写Makefile9. make编译模块10. 安装模块sudo insmod list2.ko11. 查看系统信息dmesg12. 退出模块sudo rmmod list2【代码实现】 1.list.c#include #include #include #include #include #define METHOD 1static int list_init(voi
3、d)struct task_struct *p;int count;char *method;count = 0; /*下面这些初始化完全是为了消除编译时的警告信息*/p = NULL;method = NULL;method=for_each_process;printk( The method is %sn, method );printk(KERN_ALERT进程号t父进程t状态t名称n);#if METHOD = 1for_each_process(p) count+;printk( KERN_ALERT %dt%dt%ldt%sn, p-pid,p-parent-pid,p-stat
4、e, p-comm );#endifprintk(系统当前共 %d 个进程!, count);return 0;static void list_exit(void)printk( KERN_ALERT GOOD BYE!n);module_init( list_init );module_exit( list_exit );MODULE_AUTHOR( Along );MODULE_LICENSE( GPL );makefileifneq ($(KERNELRELEASE),) obj-m := list.oelse KERNELDIR ?= /lib/modules/$(shell una
5、me -r)/build PWD := $(shell pwd)default:$(MAKE) -C $(KERNELDIR) M=$(PWD) moduleselean:rm -rf *.o *.mod.c *.ko *.syvmersendif2.list2.c#include #include #include #include #include #define METHOD 1static int pidd = 1;module_param(pidd,int,S_IRUGO|S_IWUSR);EXPORT_SYMBOL(pidd);static int _init list_init(
6、void)struct task_struct *task, *p,*ppid;struct list_head *pos;int count;char *method;count = 0; /*下面这些初始化完全是为了消除编译时的警告信息*/p = NULL;task = NULL;pos = NULL;method = NULL;task = &init_task;method=for_each_process;printk( The method is %sn, method );printk(KERN_ALERT进程号t状态t名称t父进程t父进程名n);#if METHOD = 1fo
7、r_each_process(p) count+;if (pidd = p-pid)printk( KERN_ALERT %dt%ldt%st%dt%sn,p-pid,p-state,p-comm,p-parent-pid,p-parent-comm);ppid=p-parent;待添加的隐藏文字内容3printk(兄弟进程名:t进程号:t 进程状态:tn);list_for_each_entry(ppid, &p-real_parent-children, sibling) printk( %s t%dt%ldtn,ppid-comm,ppid-pid,p-state); printk(子进
8、程名:t进程号:t 进程状态:tn);list_for_each_entry(ppid, &p-children, sibling) printk( %s t%dt%ldtn,ppid-comm,ppid-pid,p-state); #endifprintk(系统当前共 %d 个进程!, count);return 0;static void _exit list_exit(void)printk( KERN_ALERT GOOD BYE!n);module_init( list_init );module_exit( list_exit );MODULE_AUTHOR( liyou );MODULE_LICENSE( GPL );makefile _ifneq ($(KERNELRELEASE),) obj-m := list2.oelse KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd)default:$(MAKE) -C $(KERNELDIR) M=$(PWD) moduleselean:rm -rf *.o *.mod.c *.ko *.syvmersendif