实验题目:linux内核编模块编程

 

  1. 实验题目:linux内核编模块编程
  1. 设计一个模块,要求列出系统中所有内核线程的程序名、PID 号、进程状态及进程优先级。
  2. 设计一个带参数的模块,其参数为某个进程的 PID 号,该模块的功能是列出该进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID 号。
  3. 请根据自身情况,进一步阅读分析程序中用到的相关内核函数的源码实现。

 

  1. 分析程序运行结果

insmod moduleone.ko

dmesg

rmmod moduleone

dmesg

第(1)小题运行结果

insmod module_two.ko pid=10

dmesg

rmmod module_two

dmesg

 

第(2)小题运行结果

  1. 程序完整代码

实验(1)代码:

#include

#include

#include

#include

#include

static int moduleone_init(void)

{

        struct task_struct *p;

        printk(KERN_ALERT"Name \t\t PID \t State \t Prio\t");

        for_each_process(p)

        {

                if(p->mm == NULL)

                  printk(KERN_ALERT"%s\t%d\t%d\t%d\n",p->comm,p->pid, p->state,p->static_prio);

        }

        return 0;

}

static void moduleone_exit(void)

{

        printk(KERN_ALERT "MooduleOne has exit  successfully!\n");

}

module_init(moduleone_init);

module_exit(moduleone_exit);

MODULE_LICENSE("GPL");

实验(1makefile文件:

obj-m:=moduleone.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)代码:
#include

#include

#include

#include

#include

 

static pid_t pid;

module_param(pid,int,0644);

 

static int module_two_init(void)

{

    struct task_struct *p;

    struct list_head *pp;

    struct task_struct *psibling;

 

     p = pid_task(find_vpid(pid), PIDTYPE_PID);//根据pid值,找到task

    if(p->parent==NULL)

        {

            printk("No Parent\n");

        }

        else

       {

            printk("Parent : %d %s\n",p->parent->pid,p->parent->comm);

    }

 

    list_for_each(pp,&p->parent->children)//遍历p的父亲节点的孩子节点(p的兄弟节点)

    {

         psibling=list_entry(pp,struct task_struct,sibling);

         printk("sibling %d %s \n",psibling->pid,psibling->comm);

    }

    list_for_each(pp,&p->children)//遍历p的孩子节点

    {

         psibling=list_entry(pp,struct task_struct,sibling);

            printk("children %d %s \n",psibling->pid,psibling->comm);

    }

        return 0;

}

static void module_two_exit(void)

{

        printk(KERN_ALERT "ModuleTwo has exit successfully!\n");

}

module_init(module_two_init);

module_exit(module_two_exit);

MODULE_LICENSE("GPL");

 

实验(2makefile文件:
obj-m:=module_two.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

 

你可能感兴趣的:(操作系统实验)