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

本文介绍了两个具体的Linux内核模块编程案例。第一个案例展示了如何列出系统中所有内核线程的基本信息,如程序名、PID号等。第二个案例则通过指定PID号来展示特定进程及其家族成员的详细信息。

 

  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<linux/init.h>

#include<linux/module.h>

#include<linux/kernel.h>

#include <linux/sched.h>

#include<linux/sched/signal.h>

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 <linux/init.h>

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/sched.h>

#include <linux/moduleparam.h>

 

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

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值