遍历一个进程的`vm_area_struct`

时间:2015-06-02 19:04:42

标签: c linux linux-kernel filesystems mmap

作为Traversing all the physical pages of a processhttp://www.makelinux.net/ldd3/chp-15-sect-1数据的答案的扩展,我有一个小问题。在建议的第一个答案中,遍历流程的物理页面,

struct vm_area_struct *vma = 0;
unsigned long vpage;
if (task->mm && task->mm->mmap)
    for (vma = task->mm->mmap; vma; vma = vma->vm_next)
        for (vpage = vma->vm_start; vpage < vma->vm_end; vpage += PAGE_SIZE)
            unsigned long phys = virt2phys(task->mm, vpage);

并参考第二个链接中“ 15.1.6。虚拟记忆区域”标题下的示例,

# cat /proc/1/maps     look at init
08048000-0804e000 r-xp 00000000 03:01 64652      /sbin/init   text
0804e000-0804f000 rw-p 00006000 03:01 64652      /sbin/init   data
0804f000-08053000 rwxp 00000000 00:00 0           zero-mapped BSS
40000000-40015000 r-xp 00000000 03:01 96278      /lib/ld-2.3.2.so   text
40015000-40016000 rw-p 00014000 03:01 96278      /lib/ld-2.3.2.so   data

现在我的问题是,当我遍历时,第一个区域的vm_startvm_end的值为080480000804e000,或者是{{1和08048000(一个连续的内存块)。我应该编写一个程序并亲自尝试,但我将这些数据用于另一个项目,如果有人能帮助理解这一点,那将非常有用。我基本上想知道,如果

08053000

是属于该进程的一个“模块”,它是否具有一个或多个08048000-0804e000 r-xp 00000000 03:01 64652 /sbin/init text 0804e000-0804f000 rw-p 00006000 03:01 64652 /sbin/init data 0804f000-08053000 rwxp 00000000 00:00 0 zero-mapped BSS 数据结构。

谢谢。

1 个答案:

答案 0 :(得分:0)

每个地图部分都有一个单独的vm_area_struct。如果您查看fs/proc/task_mmu.c,函数m_start()m_next中的代码,您会看到maps伪文件中的行是通过迭代遍历创建的进程vma列表。另请注意struct vm_area_struct声明中的评论:

/*
 * This struct defines a memory VMM memory area. There is one of these
 * per VM-area/task.  A VM area is any part of the process virtual memory
 * space that has a special rule for the page-fault handlers (ie a shared
 * library, the executable area etc).
 */

显然,文本,数据和BSS部分具有不同的页面错误处理规则:文本根本无法写入。数据是首先读取访问,然后是写入时复制。 BSS在首次访问时被归零。