分享

如何判断linux内核中如何判断条件编译

 WUCANADA 2015-06-23


在阅读linux源码时,经常遇到条件编译的情况,如下:

#ifdef CONFIG_FLAT_NODE_MEM_MAP

    /* ia64 gets its own node_mem_map, before this, without bootmem */

    if (!pgdat->node_mem_map) {

......

    }

#ifndef CONFIG_NEED_MULTIPLE_NODES

    /*

     * With no DISCONTIG, the global mem_map is just set as node 0's

     */

    if (pgdat == NODE_DATA(0)) {

        mem_map = NODE_DATA(0)->node_mem_map;

#ifdef CONFIG_ARCH_POPULATES_NODE_MAP

        if (page_to_pfn(mem_map) != pgdat->node_start_pfn)

            mem_map -= (pgdat->node_start_pfn - ARCH_PFN_OFFSET);

#endif /* CONFIG_ARCH_POPULATES_NODE_MAP */

    }

#endif

#endif /* CONFIG_FLAT_NODE_MEM_MAP */


这段代码中有三个宏CONFIG_FLAT_NODE_MEM_MAP、CONFIG_NEED_MULTIPLE_NODES、CONFIG_ARCH_POPULATES_NODE_MAP,所以必须知道这些宏的定义情况才能很好的阅读内核代码。一个比较简单的方法是:在阅读内核之前先把内核用默认配置编译一遍(或者不用编译,只需要生成.config文件即可),在编译完之后会在内核根目录生成一个名为.config的隐藏文件,在这个文件中记录了内核中宏的定义情况,遇到类似于需要知道宏是否被定义的情况是,可以去.config文件中去查找。

上面所说的三个宏,在默认配置的时候定义如下:

CONFIG_FLAT_NODE_MEM_MAP=y

CONFIG_NEED_MULTIPLE_NODES,宏没找到,即该宏没有定义。

CONFIG_ARCH_POPULATES_NODE_MAP=y

由此就能知道哪些代码在编译的时候被编译进了内核。




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多