admin管理员组文章数量:1794759
杭电操作系统实验二
一、题目介绍
·阅读教材7.3.2节Linux内核模块简介 ,网上查找资料,了解Linux内核模块的基本概念。
·阅读教材7.3.3内核模块编程基础 ,网上查找资料(tldp/LDP/lkmpg/2.6/html/index.html),了解Linux内核模块的编写方法。
2、设计和添加Linux 内核模块
(1)设计一个带参数的模块,其参数为某个进程的PID号,模块的功能是列出该进程的家族信,包括父进程、兄弟进程和子进程的程序名、PID号、进程状态。
(2)设计一个模块,显示当前系统的名称和版本
二、设计和添加Linux 内核模块1、设计一个带参数的模块,其参数为某个进程的PID号,模块的功能是列出该进程的家族信,包括父进程、兄弟进程和子进程的程序名、PID号、进程状态。
1.1 cd home 进入home目录(初始home目录应该为空)
1.2 mkdir test1 新建test1文件夹,“cd test1”进入test1文件夹
1.3 vim module1.c
#include <linux/kernel.h> #include <linux/sched.h> #include <linux/module.h> #include <linux/init.h> #include <linux/moduleparam.h> static pid_t pid=1; module_param(pid, int, 0644); static int module1_init(void) { struct task_struct *p; struct list_head *pp; struct task_struct *psibling; //当前进程的PID p = pid_task(find_vpid(pid),PIDTYPE_PID); printk("me: %d %ld %s \\n",p->pid,p->state,p->comm); //父进程 if(p->parent == NULL){ printk("No Parent\\n"); } else{ printk("Parent:%d %ld %s \\n",p->parent->pid,p->parent->state,p->parent->comm); } //兄弟进程 list_for_each(pp,&p->parent->children) { psibling = list_entry(pp,struct task_struct,sibling); printk("Brother %d %ld %s \\n",psibling->pid,psibling->state,psibling->comm); } //子进程 list_for_each(pp,&p->children) { psibling = list_entry(pp,struct task_struct,sibling); printk("Children %d %ld %s \\n",psibling->pid,psibling->state,psibling->comm); } return 0; } static void module1_exit(void) { printk(KERN_ALERT"goodbye!\\n"); } module_init(module1_init); module_exit(module1_exit); MODULE_LICENSE("GPL");1.4 vim Makefile
obj-m := module1.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) clean注:如果此时复制代码进去,显示如下图
那么就是这两句标红句前面的缩进有问题,删掉重新tab缩进,就不会出现红色了
1.5 make
insmod module1.ko pid=4
编译模块
1.6 dmesg 查看结果
已经成功输出啦!!!
1.7 输入“rmmod module1”,卸载模块,输入dmesg查看,成功卸载
2、设计一个模块,显示当前系统的名称和版本
2.1切换至home目录下输入“makdir test2”新建test2文件,“cd test2”进入test2文件
注:cd / 返回根目录
2.2 vim module2.c
#include<linux/kernel.h> #include<linux/init.h> #include<linux/utsname.h> #include<linux/module.h> // 初始化函数 static int hello_init(void) { printk("sysname:%s \\n version:%s",utsname()->sysname,utsname()->version); return 0; } // 清理函数 static void hello_exit(void) { printk("goodbye!\\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL");2.3 vim Makefile
obj-m := module2.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) clean2.4 输入“make”,进行模块编译
输入“insmod module2.ko”,加载模块
输入"dmesg",查看
成功输出
ps:
1、如果在make过程中报错,建议看看编写的程序里是否存在缩进问题
2、如果加载模块时,出现下图的报错
可以输入
先卸载该模块,再重新加载该模块试试
本文标签: 操作系统
版权声明:本文标题:杭电操作系统实验二 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686949538a121475.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论