//print_task_info.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init_task.h>
#include <linux/sched.h>
MODULE_LICENSE("GPL");
static int __init print_pid(void)
{
int task_cnt = 0;
struct task_struct *task, *p;
struct list_head *pos;
task = &init_task;
list_for_each(pos, &task->tasks)
{
p = list_entry(pos, struct task_struct, tasks);
task_cnt += 1;
printk("pid:%d, state:%x, ", p->pid, p->state);
if(p->mm != NULL)
printk("total_vm : %ld\n", (p->mm)->total_vm);
}
printk("\n task count : %d\n", task_cnt);
return 0;
}
static void __exit pid_exit(void)
{
printk("\n module exit \n");
}
module_init(print_pid);
module_exit(pid_exit);
#Makefile
obj-m:=print_task_info.o
CURRENT_PATH := $(shell pwd)
LINUX_KERNEL := $(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
make之后insmod,部分效果如下