如何在Linux源代码中找到PageDirty函数或宏定义?

时间:2019-06-14 14:02:17

标签: c linux

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是宏定义还是函数?如何找到其定义?

1 个答案:

答案 0 :(得分:1)

find /usr/src/linux -type f -print0 | xargs -0 grep $'^[^ \t].*PageDirty'

该路径可能是错误的,但是假设您的shell是bash,则其余部分现在应该复制/粘贴。如果您的外壳不支持$'(不会出现错误),则必须恢复为嵌入文字标签。

我们正在寻找的是包含PageDirty的全局定义行。在典型的c样式中,仅包含全局定义,并且全局注释不以空格或制表符开头。您仍然会获得一些额外的点击。从grep输出中显而易见哪一个是正确的。

事实上,PageDirty()是一个宏,可以扩展为对页面元数据结构进行位测试。上方的find行将在头文件中找到#define PageDirty行。

PageDirty()的功能在代码片段中很清楚。它检查作为参数传递的页面是否脏(也就是说,在丢弃之前需要将其写入磁盘)。