内存管理-31-每进程内存统计-3-/proc/pid/maps‌

基于msm-5.4


一、初探

此文件描述了进程使用的每个内存段的信息,但是并不是所有的段,也不是一个段的所有部分都加载到内存中了,除非使用了对应的页面。

1. 打印格式

# cat /proc/593/maps
5e0cb16000-5e0cc1a000 r--p 00000000 fc:03 100868352                      /system/bin/surfaceflinger
7ba8276000-7ba9696000 rw-s 00000000 00:0a 67455                          /dmabuf:
7ba9a26000-7ba9a28000 rw-p 00000000 00:00 0
7bb020a000-7bb043d000 r--p 00000000 fc:05 9842176                        /vendor/lib64/libllvm-qgl.so
7e560f2000-7e560fa000 rw-p 00000000 00:00 0                              [anon:.bss]
7fc9c26000-7fc9c47000 rw-p 00000000 00:00 0                              [stack]

打印成员介绍:

各字段打印的内容见 show_map_vma()

(1) 5e0cb16000-5e0cc1a000: vma->vm_start - vma->vm_end

(2) r--p:
vma->vm_flags & VM_READ ? 'r' : '-'
vma->vm_flags & VM_WRITE ? 'w' : '-'
vma->vm_flags & VM_EXEC ? 'x' : '-'
vma->vm_flags & VM_MAYSHARE ? 's' : 'p'

(3) 00000000: vma->vm_pgoff << PAGE_SHIFT

(4) fc:03: MAJOR(inode->i_sb->s_dev):MINOR(inode->i_sb->s_dev), 其中 i_sb 是 struct super_block 类型的成员。

这里 fc:03 是 252:3, 对应的应该是下面这个节点:

/dev/block # ls -l
brw------- 1 root root 252, 3 1970-01-01 08:00 dm-3

(5) 100868352: inode->i_ino, 与 ls -i 的值相等。

(6) /system/bin/surfaceflinger: name, 如果对应的 vma->vm_file != NULL 则打印 name=file->f_path, 否则,如果 vma->vm_ops->name 回调存在则打印 name=vma->vm_ops->name(vma), 再则,若 vma->vm_mm 为NULL则打印 name="[vdso]",若 (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) 则打印 name="[heap]",若 is_stack(vma) 成立则打印 name="[stack]".


2. 实现

static const struct pid_entry tgid_base_stuff[] = {
    REG("maps",       S_IRUGO, proc_pid_maps_operations),
};
static const struct pid_entry tid_base_stuff[] = {
    REG("maps",      S_IRUGO, proc_pid_maps_operations),
};

static int show_map(struct seq_file *m, void *v) //proc/task_mmu.c
{
    show_map_vma(m, v); //打印在这里面
    m_cache_vma(m, v); //这是游标向后遍历一个vma
    return 0;
}

 

posted on 2024-08-26 21:55  Hello-World3  阅读(5)  评论(0编辑  收藏  举报

导航