Chinaunix首页 | 论坛 | 博客
  • 博客访问: 372390
  • 博文数量: 47
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 1290
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-25 16:14
文章分类

全部博文(47)

文章存档

2019年(1)

2014年(1)

2013年(9)

2012年(36)

分类: LINUX

2012-08-03 10:32:55

    以前感觉自己看东西还是不透彻,今天认真的去做学这个知识点,感觉收获挺大的。这几天一直看得内存管理。先做一部分笔记。
    一个程序编译链接后形成的地址空间是一个虚拟地址空间,最终必须把用户空间中的虚地址最终映射到物理存储空间才行。而这种映射的建立和管理是由内核完成的。
     一个进程的用户空间主要由两个数据结构来描述。一个是mm_struct结构,它对进程的整个用户空间进行描述,简称内存描述符,另一个是vm_area_struct结构,它对用户空间中各个区间(简称虚存区)进行描述。
    进程控制快是内核中的核心数据结构,在进程的task_struct结构中包含一个mm域,它是指向mm_struct结构的指针。而进程的mm_struct结构则又包含进程的可执行影像信息以及进程的页目录指针PGD。如下就是其关系:
  虚拟内存(VM) - wanny - wanny    
 打印当前的进程虚存区如何实现呢?可以使用全局变量current来实现:


  1. static int mm_init(void)
  2. {
  3.     
  4.         struct mm_struct *mm=current->mm;
  5.     struct vm_area_struct *temp;

  6.     printk("The virtual memory areas(VMA) are:\n");
  7.     printk("current:%s pid :%d\n",current->comm,current->pid);
  8.         down_read(&mm->mmap_sem); 获取mm信号量
  9.     temp=mm->mmap;
  10.     while(temp)
  11.     {
  12.         printk("start :%p\t end:%p\n",(unsigned long *)temp->vm_start,(unsigned long *)temp->vm_end);
  13.         temp=temp->vm_next;
  14.     }
  15.         up_read(&mm->mmap_sem);
  16.     return 0;
  17. }

 如果我们知道进程的PID,想要打印出该进程的虚存区应如何打印?最简单的办法可以从命令行传进去进程的PID给模块,然后通过函数找出进程,下面是具体的代码:


  1. static int pid=1; //初始值
  2. module_param(pid,int,S_IRUSR); //传递参数
  3. static int mm_init(void)
  4. {
  5. struct task_struct *p;
  6. struct vm_area_struct *temp;
  7. struct pid *k;
  8. printk("The virtual memory areas(VMA) are:\n");
  9. k=find_vpid(pid);
  10. p=pid_task(k,PIDTYPE_PID); //根据局部数字PID和UNIX进程ID找到进程
  11. temp=p->mm->mmap; //指向线性区域的链表头
  12. printk("process:%s pid :%d\n",p->comm,p->pid);
  13. while(temp)
  14. {
  15. printk("start :%p\t end:%p ",(unsigned long *)temp->vm_start,(unsigned long *)temp->vm_end);
  16. if(temp->vm_flags & VM_READ)
  17. printk("r");
  18. else
  19. printk("-");
  20. if(temp->vm_flags & VM_READ)
  21. printk("w");
  22. else
  23. printk("-");
  24. if(temp->vm_flags & VM_EXEC)
  25. printk("x");
  26. else
  27. printk("-");
  28. printk("\n");
  29. temp=temp->vm_next;
  30. }
  31. return 0;
  32. }
也可以从/proc/进程号/maps得到这些信息,进行对比。
阅读(2657) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

lwp2252012-09-26 10:02:36

Bean_lee: 正在想把进程的虚拟内存 打印出来,呵呵 文章不错。
博主是MM ?.....
呵呵,共同学习,有不对的还请指出来!

Bean_lee2012-09-26 00:10:08

正在想把进程的虚拟内存 打印出来,呵呵 文章不错。
博主是MM ?