Linux源代码中fs / proc / task_mmu.c文件的第458行中,包含以下代码:
for (i = 0; i < nr; i++, page++) {
int mapcount = page_mapcount(page);
unsigned long pss = (PAGE_SIZE << PSS_SHIFT);
if (mapcount >= 2) {
if (dirty || PageDirty(page))
mss->shared_dirty += PAGE_SIZE;
else
mss->shared_clean += PAGE_SIZE;
mss->pss += pss / mapcount;
if (locked)
mss->pss_locked += pss / mapcount;
} else {
if (dirty || PageDirty(page))
mss->private_dirty += PAGE_SIZE;
else
mss->private_clean += PAGE_SIZE;
mss->pss += pss;
if (locked)
mss->pss_locked += pss;
}
}
PageDirty是宏定义还是函数?如何找到其定义?
答案 0 :(得分:1)
find /usr/src/linux -type f -print0 | xargs -0 grep $'^[^ \t].*PageDirty'
该路径可能是错误的,但是假设您的shell是bash,则其余部分现在应该复制/粘贴。如果您的外壳不支持$'(不会出现错误),则必须恢复为嵌入文字标签。
我们正在寻找的是包含PageDirty的全局定义行。在典型的c样式中,仅包含全局定义,并且全局注释不以空格或制表符开头。您仍然会获得一些额外的点击。从grep输出中显而易见哪一个是正确的。
事实上,PageDirty()是一个宏,可以扩展为对页面元数据结构进行位测试。上方的find
行将在头文件中找到#define PageDirty
行。
PageDirty()
的功能在代码片段中很清楚。它检查作为参数传递的页面是否脏(也就是说,在丢弃之前需要将其写入磁盘)。