From 46682f8ea5c0114a40da0bc1ffb67c78b57fe077 Mon Sep 17 00:00:00 2001 From: gatieme Date: Mon, 16 May 2016 21:26:51 +0800 Subject: [PATCH] =?UTF-8?q?find-task=E4=B8=AD=E6=B7=BB=E5=8A=A0=E4=BA=86pr?= =?UTF-8?q?int=5Fvm=5Farea=E7=9A=84=E4=BB=A3=E7=A0=81...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/kernel/process/task/find_task/Makefile | 24 +++--- .../process/task/find_task/Makefile.bak | 42 ++++++++++ .../kernel/process/task/find_task/get_task.c | 6 +- study/kernel/process/task/find_task/printvm.c | 79 +++++++++++++++++++ 4 files changed, 136 insertions(+), 15 deletions(-) create mode 100644 study/kernel/process/task/find_task/Makefile.bak create mode 100644 study/kernel/process/task/find_task/printvm.c diff --git a/study/kernel/process/task/find_task/Makefile b/study/kernel/process/task/find_task/Makefile index b059618..9d2ac51 100644 --- a/study/kernel/process/task/find_task/Makefile +++ b/study/kernel/process/task/find_task/Makefile @@ -1,30 +1,26 @@ ifneq ($(KERNELRELEASE),) -CFG_FLAGS += -O2 -I./ -EXTRA_CFLAGS += $(C_FLAGS) $(CFG_INC) $(CFG_INC) +#CFG_FLAGS += -O2 -I./ +#EXTRA_CFLAGS += $(C_FLAGS) $(CFG_INC) $(CFG_INC) -# 注意:驱动模块的名字 千万 不能和本文件夹内的任何文件同名! -MODULE_NAME := find-task #指定驱动模块的名字 -RESMAIN_CORE_OBJS := find_task.o #指定驱动模块的核心文件(有init 和 exit) -RESMAIN_GLUE_OBJS := get_task.o #依赖文件 +MODULE_NAME := find-task +RESMAIN_CORE_OBJS := find_task.o +RESMAIN_GLUE_OBJS := get_task.o -#xxx-objs := 指定驱动模块的所有依赖文件 -$(MODULE_NAME)-objs := $(RESMAIN_GLUE_OBJS) $(RESMAIN_CORE_OBJS) +find-task-objs := $(RESMAIN_GLUE_OBJS) $(RESMAIN_CORE_OBJS) +obj-m += find-task.o -#最终由xxx-objs链接生成find-task.o,再生成find-task.ko -obj-m := $(MODULE_NAME).o #最终由xxx-objs链接生成find-task.o,再生成find-task.ko +#$(MODULE_NAME)-objs := $(RESMAIN_GLUE_OBJS) $(RESMAIN_CORE_OBJS) +#obj-m := $(MODULE_NAME).o else -#最终由xxx-objs链接生成find-task.o,再生成find-task.ko KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) -all: - @echo "module name : " $(MODULE_NAME) - @echo "module objs : " $($(MODULE_NAME)-objs) +modules: make -C $(KERNELDIR) M=$(PWD) modules modules_install: diff --git a/study/kernel/process/task/find_task/Makefile.bak b/study/kernel/process/task/find_task/Makefile.bak new file mode 100644 index 0000000..51e0f1d --- /dev/null +++ b/study/kernel/process/task/find_task/Makefile.bak @@ -0,0 +1,42 @@ +ifneq ($(KERNELRELEASE),) + +#CFG_FLAGS += -O2 -I./ +#EXTRA_CFLAGS += $(C_FLAGS) $(CFG_INC) $(CFG_INC) + + +# 注意:驱动模块的名字 千万 不能和本文件夹内的任何文件同名! +MODULE_NAME := findtask #指定驱动模块的名字 +RESMAIN_CORE_OBJS := find_task.o #指定驱动模块的核心文件(有init 和 exit) +RESMAIN_GLUE_OBJS := get_task.o #依赖文件 + + +#xxx-objs := 指定驱动模块的所有依赖文件 +$(MODULE_NAME)-objs := $(RESMAIN_GLUE_OBJS) $(RESMAIN_CORE_OBJS) + +#最终由xxx-objs链接生成find-task.o,再生成find-task.ko +obj-m := $(MODULE_NAME).o#最终由xxx-objs链接生成find-task.o,再生成find-task.ko + +else + +#最终由xxx-objs链接生成find-task.o,再生成find-task.ko +KERNELDIR ?= /lib/modules/$(shell uname -r)/build +PWD := $(shell pwd) + +all: + @echo "module name : " $(MODULE_NAME) + @echo "module objs : " $($(MODULE_NAME)-objs) + make -C $(KERNELDIR) M=$(PWD) modules + +modules_install: + make -C $(KERNELDIR) M=$(PWD) modules_install + +clean: + make -C $(KERNELDIR) M=$(PWD) clean + +.PHNOY: + modules modules_install clean + + + +endif + diff --git a/study/kernel/process/task/find_task/get_task.c b/study/kernel/process/task/find_task/get_task.c index 63ee5b3..8b04698 100644 --- a/study/kernel/process/task/find_task/get_task.c +++ b/study/kernel/process/task/find_task/get_task.c @@ -9,12 +9,16 @@ #include #include +#include +#include +#include + void print_vm_list(struct task_struct *task) { struct vm_area_struct *tmp = task->mm->mmap; - printk("process:%s,pid:%d\n", p->comm, p->pid); + printk("process:%s,pid:%d\n", task->comm, task->pid); while (tmp != NULL) { diff --git a/study/kernel/process/task/find_task/printvm.c b/study/kernel/process/task/find_task/printvm.c new file mode 100644 index 0000000..7f4fa1f --- /dev/null +++ b/study/kernel/process/task/find_task/printvm.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef offsetof +#define offsetof(type, field) ((long) &((type *)0)->field) +#endif /* offsetof */ + +#ifndef container_of +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) +#endif + + +static int pid = 1; + +module_param(pid,int,0644); + +static void print_vm_area(struct vm_area_struct) +{ + ((tmp->vm_flags & VM_READ) == 1) ? printk("r") : printk("-"); + ((tmp->vm_flags & VM_WRITE) == 1) ? printk("w") : printk("-"); + ((tmp->vm_flags & VM_EXEC) == 1) ? printk("x") : printk("-"); + ((tmp->vm_flags & VM_SHARED) == 1) ? printk("s") : printk("p"); + + printk("\n"); +} + +static void print_vm_area_by_list(struct task_struct *task) +{ + struct vm_area_struct *tmp = task->mm->mmap; + + printk("process:%s,pid:%d\n", task->comm, task->pid); + + while (tmp != NULL) + { + print_vm_area(tmp); + tmp = tmp->vm_next; + } +} + + +static void visit_rbtree_node(struct rb_node *root) +{ + struct vm_area_struct *tmp; + + tmp = container_of(root,struct vm_area_struct,vm_rb); + + printk("0x%lx - 0x%lx\t",tmp->vm_start,tmp->vm_end); + + print_vm_area(tmp); +} + +static void preorder_rbtree(struct rb_node *root) +{ + if (root != NULL) + { + visit(root); + print_rb_tree(root->rb_left); + print_rb_tree(root->rb_right); + } +} + +static void print_vm_area_by_rbtree(struct task_struct *task) +{ + struct task_struct *p; + struct pid *k; + struct rb_node *root = NULL; + + root = task->mm->mm_rb.rb_node; + print_rb_tree(root); + +}