2015-06-02 6 views
0

В качестве ответа на вопрос Traversing all the physical pages of a process и данных здесь http://www.makelinux.net/ldd3/chp-15-sect-1, у меня был небольшой вопрос. В первом ответе, как было предложено пройти физические страницы процесса,Перемещение `vm_area_struct` процесса

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. Virtual Memory», которая

# 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 

является один «модуль», принадлежащий к процессу, у него есть один или несколько vm_area_struct структур данных.

спасибо.

ответ

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 обнуляется по первому доступу.

+0

Итак, вы говорите, что каждый модуль (если, например, я рассматриваю модуль как исполняемый файл эльфа с несколькими разделами), будет иметь несколько структур данных 'vm_area_struct'. ? –