2015-06-02 61 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。虛擬存儲器區」,這是

下的第二連桿給出的例子現在
# 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,還是會0804800008053000(一個連續的內存塊)。我應該編寫一個程序並自己嘗試,但是我將這些數據用於另一個項目,如果有人能夠幫助理解這一點,這將非常有幫助。我基本上想知道的是,如果

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

所以你說每個模塊(例如,如果我認爲一個模塊作爲一個可執行多個部分的elf)將有多個'vm_area_struct'數據結構。 ? –