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

最佳答案

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

路径可能是错误的,但是如果您的shell是bash,那么剩下的部分应该复制/粘贴。如果您的shell不支持$'(您不会得到错误),则必须恢复为嵌入文本选项卡。
我们要找的是一个包含PageDirty的全局定义行。在典型的c样式中,只有includes、全局定义和全局注释不以空格或制表符开头。你仍然会得到一些额外的点击。从grep输出中可以明显看出哪个是正确的。
I fact PageDirty()是一个宏,可扩展为对页元数据结构进行位测试。上面的find行将在头文件中找到#define PageDirty行。
从代码片段中可以很清楚地看出PageDirty()的作用。它检查作为参数传递的页是否脏(即,在丢弃之前需要写入磁盘)。

关于c - 如何在Linux源代码中找到PageDirty函数或宏定义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56599769/

10-16 05:10