注:在根据传递的pid参数来找tas_struct结构时候,用find_task_by_vpid好像不行,换了一种方式
struct task_struct *p=pid_task(find_get_pid(pid),PIDTYPE_PID);
先写个循环执行的程序,不让其马上终止。。
代码:
#include <stdio.h> #include <stdlib.h> int main(int ac,char**av) { int i; unsigned char *buff; buff=(char*)malloc(sizeof(char)*1024); printf("pid is %d\n",getpid()); for(i=0;i<60;i++) sleep(60); return 0; }
1 ,首先用查看proc文件中相应进程的方法来查看进程的虚拟地址域空间。
结果如下:
2,然后用在内核中打印该进程的虚拟地址域的方法
代码如下:
#include <linux/module.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/sched.h> static int pid; module_param(pid,int,0644); static int __init listvma_init(void) { struct task_struct *p; struct vm_area_struct *pm; p=pid_task(find_get_pid(pid),PIDTYPE_PID); pm=p->mm->mmap; while(pm) { printk("start:%p\tend:%p\n",(unsigned long*)pm->vm_start, (unsigned long*)pm->vm_end); pm=pm->vm_next; } return 0; } static void __exit listvma_exit(void) { printk("levaing..\n"); return ; } module_init(listvma_init); module_exit(listvma_exit); MODULE_LICENSE("GPL");
给其传递进程的参数:
insmod listvma.ko pid=231
结果如下图:
对比两个结果,发现是全部吻合的。。。。。