内存管理-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) 编辑 收藏 举报