首页
登录 | 注册

打印进程的虚存区

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

相关文章

  • Linux终端查看最消耗CPU内存的进程
    ps auxw|head -1;ps auxw|sort -rn -k3|head -10 2.内存消耗最多的前10个进程 ps auxw|head -1;ps auxw|sort -rn -k5|head -10 4.也可以试试 5.看看 ...
  • ipcs此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.SUSE.openSUSE. 1ipcs [-asmq]  [-tclup] ipcs -h 2选项 -i -m -q -s -a -t -p -c ...
  • openstack-nova-novncproxy 已死,但 pid 文件仍存...问题分析和解决方法
        经常会出现之前vnc方式好使的,但是有时候vnc就无法访问了,对这个问题我们首先应该去查看vnc proxy服务一否运行正常:       /etc/init.d/openstack-nova-novncproxy status   ...
  • 操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些归纳总结,这里归纳了10种打印需求及方法 ...
  • 一,问题介绍  给定一棵二叉树,按照层序遍历的顺序打印二叉树.但是要求,每一行打印一层数据.   二,算法分析 借助二叉树的层序遍历来实现.但是需要额外两个变量.一个变量用来保存当前层 还未打印的结点个数,另一个变量保存下一层待打印的结点个 ...
  • lprm lprm指令用来删除当前打印队列上的任务,如果没有指定,那么就删除当前打印任务.您可以指定一个或多个职务ID编号来取消这些职务,或者使用选项"-"取消所有作业. 此命令的适用范围:RedHat.RHEL.Ubu ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.013 s.
京ICP备10005923号