如何判断 linux内核 中 如何判断 条件编译
2011-11-01 17:28
260 查看
在阅读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
由此就能知道哪些代码在编译的时候被编译进了内核。
#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
由此就能知道哪些代码在编译的时候被编译进了内核。
相关文章推荐
- 如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))
- 如何以Swift版本号作为条件编译的判断依据
- 如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))
- VC2010 中使用条件编译判断是32位还是64位编译模式
- mybatis if判断int类型的查询条件如何判断空和空字符串
- 如何在JSP页面中使用JSTL标签实现if和if-else判断,判断条件使用<%=value%>
- 如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
- 如何编译Linux内核
- 一条SQL把两列的值通过函数得出另一个值时如何把它作为这条SQL的判断条件。
- 如何在编译时刻判断两个类型是否可以自动转换?——《Modern C++ Design》读书笔记(1)
- if判断条件之List 如何表示不为null
- myBatis查询某个时间区间数据<if test=""> 如何写判断条件,and 里面的内容怎么写?
- 如何在Ubuntu编译Linux内核
- SQL中text字段如何作为判断条件
- JAVA如何实现条件编译(从思路开始)
- 如何判断一段程序是由C 编译程序还是由C++编译程序编译的
- 多种条件判断时,如何高效实现所有判断
- JavaScript知识点之如何使用匿名的方法做条件判断
- 条件判断语句(if...else)与条件编译(#if .... #else ... #endif)
- 如何编译Linux内核