Lin u x 课程设计报告 学院:信息学院 专业班级:08 级网络二班 姓名: 学号: 【实验目的】 1.通过课程设计对操作系统基本原理进行更深入的认识,以Linux 为具体研究对象,分析理解操作系统底层实现,综合利用已学知识与技术,就Linux 操作系统各功能方面进行模拟或实现 2.了解内核模块结构 3.熟练内核模块编程,练习使用makefile 【实验要求】 编写proc 文件系统相关的内核模块: 设计一个模块,该模块功能是列出系统中所有内核线程的程序名、PID 号和进程状态。再设计一个带参数的模块,参数为进程的PID 号,功能是列出进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID 号。 【实验步骤】 1. 编写list.c 模块 2. 编写Makefile 3. make 编译模块 4. 安装模块su do insmod list.ko 5. 查看系统信息 dmesg 6. 退出模块su do rmmod list 7. 编写list2.c 模块 8. 编写Makefile 9. make 编译模块 10. 安装模块su do insmod list2.ko 11. 查看系统信息 dmesg 12. 退出模块su do rmmod list2 【代码实现】 1.list.c #inclu de #inclu de #inclu de #inclu de #include #define METHOD 1 static int list_init(void) { struct task_struct *p; int count; char *method; count = 0; /*下面这些初始化完全是为了消除编译时的警告信息*/ p = NULL; method = NULL; method="for_each_process"; printk( "The method is %s\n", method ); printk(KERN_ALERT"进程号\t 父进程\t 状态\t 名称\n"); #if METHOD == 1 for_each_process(p) { count++; printk( KERN_ALERT "%d\t%d\t%ld\t%s\n", p->pid,p->parent->pid,p->state, p->comm ); } #endif printk("系统当前共 %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" ); makefile ifneq ($(KERNELRELEASE),) obj-m := list.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KE...