admin管理员组

文章数量:1794759

杭电操作系统实验二

杭电操作系统实验二

一、题目介绍

  • 掌握Linux 内核模块的基本概念
  • ·阅读教材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) clean

    2.4 输入“make”,进行模块编译

    输入“insmod module2.ko”,加载模块

    输入"dmesg",查看

     

     成功输出

     ps:

    1、如果在make过程中报错,建议看看编写的程序里是否存在缩进问题

    2、如果加载模块时,出现下图的报错

    可以输入

     先卸载该模块,再重新加载该模块试试

     

    本文标签: 操作系统