遍历进程的“vm_area_struct”
Traversing `vm_area_struct`'s of a process
作为对 Traversing all the physical pages of a process and data here http://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);
并参考第二个 link 标题“15.1.6. Virtual Memory Areas”中给出的示例,即
# 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_start
和vm_end
的值是08048000
和0804e000
,还是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
是属于进程的一个"module",它有一个还是多个vm_area_struct
数据结构。
谢谢。
每个地图部分都有一个单独的 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 在首次访问时归零。
作为对 Traversing all the physical pages of a process and data here http://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);
并参考第二个 link 标题“15.1.6. Virtual Memory Areas”中给出的示例,即
# 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_start
和vm_end
的值是08048000
和0804e000
,还是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
是属于进程的一个"module",它有一个还是多个vm_area_struct
数据结构。
谢谢。
每个地图部分都有一个单独的 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 在首次访问时归零。