do { pte_t page = *pte; struct page *ptpage; address += PAGE_SIZE; pte++; if (pte_none(page)) continue; ++*total; //是合法的页都计算在内。 if (!pte_present(page)) continue; ptpage = pte_page(page); if ((!VALID_PAGE(ptpage)) || PageReserved(ptpage)) continue; ++*pages; //只有页表中含有present标记的,计算在内。 if (pte_dirty(page)) ++*dirty; //页表中dirty标记,计算在内。 if (page_count(pte_page(page)) > 1) ++*shared; //页表的所有者超过1的,就认为共享。} while (address < end);trs、drs、lrs是通过线性地址区间来进行区分的。int proc_pid_statm(struct task_struct *task, char * buffer)。。。。。while (vma) {。。。。。。。。。。。 if (vma->vm_flags & VM_EXECUTABLE) //该线性区间的flags标志为可执行。 trs += pages; /* text */ else if (vma->vm_flags & VM_GROWSDOWN) //该线性区间的flags标志为向下增长。 drs += pages; /* stack */ else if (vma->vm_end > 0x60000000) //结尾线性地址大于0x60000000。 lrs += pages; /* library */ else //这块区间应该是数据区与堆。 drs += pages; vma = vma->vm_next;}pages=trs+drs+lrs |