本文将通过内核模块打印出指定进程的虚存区,而且使用两种方式,因为进程的虚拟区有多种组织方式。一种是单链表,一种是红黑树。
红黑树是基于树的查找,效率很高,主要用来快速定位进程的某个虚存区。
红黑树也属于二叉树的范畴,故这儿就使用二叉树的先序的递归形式遍历。
--------------------------------------------------------------------------------
一,使用单链表形式。 1,首先根据进程的pid(模块传参)定位到进程的PCB。
通过如下两个函数实现。 - k = find_vpid(pid);
- p = pid_task(k,PIDTYPE_PID);
2,根据进程task_struct可以找到单链表的头,故接下来就是遍历一个单链表了。- static void printvm_list(void)
- {
- struct task_struct *p;
- struct pid *k;
- struct vm_area_struct *tmp;
-
- k = find_vpid(pid);
- p = pid_task(k,PIDTYPE_PID);
- tmp = p->mm->mmap;
-
- printk("process:%s,pid:%d\n",p->comm,p->pid);
- while (tmp != NULL) {
- printk("0x%lx - 0x%lx\t",tmp->vm_start,tmp->vm_end);
- if (tmp->vm_flags & VM_READ)
- printk("r");
- else
- printk("-");
- if (tmp->vm_flags & VM_WRITE)
- printk("w");
- else
- printk("-");
-
- if (tmp->vm_flags & VM_EXEC)
- printk("x");
- else
- printk("-");
-
- if (tmp->vm_flags & VM_SHARED)
- printk("s\n");
- else
- printk("p\n");
- tmp = tmp->vm_next;
- }
- }
-------------------------------------------------------------------------------------
二,遍历二叉树的形式。
1,同样是通过进程的pid找到进程的task_struct。
2,通过task_struct找到树的根,然后就是先树遍历二叉树了。- static void visit(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);
- if (tmp->vm_flags & VM_READ)
- printk("r");
- else
- printk("-");
- if (tmp->vm_flags & VM_WRITE)
- printk("w");
- else
- printk("-");
-
- if (tmp->vm_flags & VM_EXEC)
- printk("x");
- else
- printk("-");
-
- if (tmp->vm_flags & VM_SHARED)
- printk("s\n");
- else
- printk("p\n");
- }
- static void print_rb_tree(struct rb_node *root)
- {
- if (root != NULL) {
- visit(root);
- print_rb_tree(root->rb_left);
- print_rb_tree(root->rb_right);
- }
- }
- static void printvm_tree(void)
- {
- struct task_struct *p;
- struct pid *k;
- struct rb_node *root = NULL;
- k = find_vpid(pid);
- p = pid_task(k,PIDTYPE_PID);
- root = p->mm->mm_rb.rb_node;
- print_rb_tree(root);
- return ;
- }
---------------------------------------------------------------------------
模块完整代码: print_vm.rar ---------------------------------------------------------------------------
阅读(2200) | 评论(0) | 转发(0) |