内核模块打印task_struct的进程号,优先级,调度策略,状态,CPU和进程名

打印task_struct的进程号,优先级,调度策略,状态,CPU和进程名
  • pcb.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include "policy.h"
#include "state.h"

static int __init hello_init(void)
{
	const struct task_struct *p;
	unsigned int nr_cpu;
	unsigned int nr_policy;
	volatile long nr_state;
	static int i;

	for (i = 0; i < 10; i++)
		printk("\n");	// 清屏专用

	printk("list of process information...\n");

	for_each_process(p) {
		nr_cpu = task_cpu(p);
		nr_policy = p->policy;
		nr_state = p->state;

		printk
		    ("pid:%d    \t优先级:%d\t调度策略:%s  \t状态:%s \tCPU:%u\t进程名:%s\n",
		     p->pid, p->normal_prio, tran_policy(nr_policy),
		     tran_state(nr_state), nr_cpu, p->comm);
	}

	return 0;
}

static void __exit hello_exit(void)
{
	printk("goodbye, kernel.\n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
  • policy.h
/*
 * Scheduling policies
 */
/*
 * #define SCHED_NORMAL		0
 * #define SCHED_FIFO		1
 * #define SCHED_RR		2
 * #define SCHED_BATCH		3
 */
/* SCHED_ISO: reserved but not implemented yet */
/*
 * #define SCHED_IDLE		5
 */
/* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */
/* 
 * #define SCHED_RESET_ON_FORK     0x40000000
 */

char *tran_policy(unsigned int policy)
{
	char *cp;

	switch (policy) {
	case 0:
		cp = "SCHED_NORMAL";
		break;
	case 1:
		cp = "SCHED_FIFO";
		break;
	case 2:
		cp = "SCHED_RR ";
		break;
	case 3:
		cp = "SCHED_BATCH";
		break;
	case 5:
		cp = "SCHED_IDLE";
		break;
	case 0x40000000:
		cp = "SCHED_RESET_ON_FORK";
		break;
	default:
		cp = "unknown";
		break;
	}

	return cp;
}
  • state.h
/*
 * #define TASK_RUNNING		0
 * #define TASK_INTERRUPTIBLE	1
 * #define TASK_UNINTERRUPTIBLE	2
 * #define __TASK_STOPPED		4
 * #define __TASK_TRACED		8
 */
/* in tsk->exit_state */
/*
 * #define EXIT_ZOMBIE		16
 * #define EXIT_DEAD		32
 */
/* in tsk->state again */
/*
 * #define TASK_DEAD		64
 * #define TASK_WAKEKILL		128
 * #define TASK_WAKING		256
 * #define TASK_PARKED		512
 */

char *tran_state(volatile long state)
{
	char *s = NULL;

	switch (state) {
	case 0:
		s = "TASK_RUNNING      ";
		break;

	case 1:
		s = "TASK_INTERRUPTIBLE";
		break;

	case 2:
		s = "TASK_UNINTERRUPTIBLE";
		break;
	case 4:
		s = "__TASK_STOPPED";
		break;
	case 8:
		s = "__TASK_TRACED";
		break;
	case 16:
		s = "EXIT_ZOMBIE";
		break;
	case 32:
		s = "EXIT_DEAD";
		break;
	case 64:
		s = "TASK_DEAD";
		break;
	case 128:
		s = "TASK_WAKEKILL";
		break;
	case 256:
		s = "TASK_WAKING";
		break;
	case 512:
		s = "TASK_PARKED";
		break;
	default:
		s = "unknown           ";
		break;
	}

	return s;
}

  • Makefile
ifneq ($(KERNELRELEASE),)

obj-m := pcb.o

else

KDIR := /lib/modules/$(shell uname -r)/build
PWD  := $(shell pwd)

all:
	make -C $(KDIR) M=$(PWD) modules

clean:
	make -C $(KDIR) M=$(PWD) clean

endif

运行结果
在这里插入图片描述
在这里插入图片描述

发布了42 篇原创文章 · 获赞 18 · 访问量 7553

猜你喜欢

转载自blog.csdn.net/weixin_44395686/article/details/104933196