linux 打印内存地址,Linux内存管理实践-打印内存区域

本文将通过一些简单的内核模块程序,显示一个进程的所有内存区域。通过此程序理解进程的整个地址空间与内存区域之间的关系。

打印内存区域

上文中,我们通过打印某个进程的maps文件来查看某个进程的内存区域。如果你理解了进程,进程的用户空间,内存区域三者之间的关系,那么就可以通过内核模块的方式打印指定进程的内存区域。

通过在内核模块加载函数中调用下述函数,来打印当前进程的内存区域。首先通过全局变量current获得当前进程的mm字段,该字段指向当前进程的用户空间(mm_struct);由于多个内存区域(vm_area_struct)是通过一个双链表(最新内核中)链接在一起的,所以在接下来的for循环当中,依次遍历各个内存区域,打印当前内存区域的起始地址和终止地址,并且打印内核对该区域的操作权限。完整代码在这里。

static void list_myvma(void)

{

struct mm_struct *mm = current->mm;

struct vm_area_struct *vma;

printk("list vma..\n");

//print the current process's name and pid

printk("current:%s pid:%d\n",current->comm,current->pid);

down_read(&mm->mmap_sem);

//vma is a linklist

for(vma = mm->mmap; vma; vma = vma->vm_next)

{

//from the begining to the ending of a virtual memory area

printk("0x%lx-0x%lx ",vma->vm_start,vma->vm_end);

//check the flags of this VMA

if(vma->vm_flags & VM_READ)

printk("r");

else

printk("-");

if(vma->vm_flags & VM_WRITE)

printk("w");

else

printk("-");

if(vma->vm_flags & VM_EXEC)

printk("x");

else

printk("-");

if(vma->vm_flags & VM_SHARED)

printk("s");

else

printk("p");

printk("\n");

}

up_read(&mm->mmap_sem);

}

试一下吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值