在阅读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

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

如何判断 linux内核 中 如何判断 条件编译相关推荐

  1. Linux内核中锁机制之完成量、互斥量

    在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...

  2. 如何放出Linux内核中的链表大招

    前言 上回,我们说到Linux内核中max()宏的终极奥义,Linux内核链表也不甘示弱,那么接下来,让我们看看Linux内核中的链表大招. 如何放出Linux内核中的链表大招 前言 一.链表简介 ( ...

  3. Linux内核中max()宏的奥妙何在?(一)

    Linux内核中max()宏的奥妙何在?(一) 1.max()宏那点事 在Linux内核中,有这样四个比较大小的函数,如下: max(x,y) //两个数求最大值 min(x,y) //两个数求最小值 ...

  4. Linux内核中max()宏的奥妙何在?(二)——大神Linus对这个宏怎么看?

    最新max()宏 上回,我们在<Linux内核中max()宏的奥妙何在?(一)>一文中说到,在3.18.34版Linux内核源码中的max()宏,采用了GCC的扩展特性,可以避免一些错误. ...

  5. Linux 内核中的 GCC 特性(zz)

    from:http://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/ GCC 和 Linux 是出色的组合.尽管它们是独立的软件,但是 Linux ...

  6. linux标准c和c编译器6,linux内核中GNU C和标准C的区别

    linux内核中GNU C和标准C的区别 今天看了一下午的linux内核编程方面的内容,发现linux 内核中GNU C与标准C有一些差别,特记录如下: linux 系统上可用的C编译器是GNU C编 ...

  7. TCP三次握手在linux内核中的实现

    TCP三次握手在linux内核中的实现 以下基于linux内核2.4.0源码(转自www.yuanma.org/) 以前一直使用的网络通讯的函数都是工作在阻塞模式.在看connect实现源码时,突然想 ...

  8. Linux内核中的进程组及会话

    Linux内核中的进程组及会话 将阐述Linux内核中的如下几个概念 1) 进程组 2) 会话 3) 控制终端 前面的概念来源于前人,我只是站在前人的肩膀上结合内核中的实现加深概念理解. 1.概念: ...

  9. Linux内核中无名管道pipe和有名管道fifo的分析

    1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...

  10. linux 信号量锁 内核,Linux内核中锁机制之信号量、读写信号量

    在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...

最新文章

  1. python进程间通信的秘密
  2. PostgreSQL-PL/pgSQL
  3. “知识图谱+”系列:知识图谱+强化学习
  4. 四、华为鸿蒙HarmonyOS应用开发之Java开发下Page Ability生命周期
  5. idea java xml文件内容_idea 中web.xml 文件的标签疯狂报错
  6. 在集设海量拍摄配色案例 | 轻松掌握高级感配色,再也不愁没有灵感
  7. TensorFlow基础笔记(6) 图像风格化实验
  8. 蓝牙通信-搜索附近的蓝牙设备
  9. 2022新版千月影视双端APP带H5功能开源程序支持当面付和易支付
  10. 4.12作业--CSS
  11. windows 10 arm架构ISO下载
  12. ARGB_8888(ARGB32)色彩格式
  13. 手写数字识别系统学习(1)
  14. java pkcs_在 Python 3 (PKCS#1)中,如何正确使用来自 Java (PKCS#8) 的 RSA 私钥,进行数据解密?...
  15. Camstar开发:缓存的设计与实现(整合Redis实例)
  16. 零起点学VB做外挂(六)
  17. Index hint 和 Index 的区别
  18. Microsoft Touch Pack(Windows 7)
  19. 《计算机图形学》学习笔记(二)
  20. 合振动的初相位推导_合振动的初相位确定方法

热门文章

  1. matlab实现epirb调制,[单选] 根据《建筑安装工程费用项目组成》(建标[2003]206号)的规定,下列属于直接工程费中材料费的是()。...
  2. Hadoop 开源调度系统zeus
  3. Spring Boot中的默认日志logback
  4. Linux系统究竟我要怎样学?
  5. Lucene.Net中 FSDirectory存储方式下一个 Document是如何得到的
  6. Python爬虫从入门到放弃(二十四)之 Scrapy登录知乎
  7. Mac Brew Uninstall MySql
  8. SQL Server常用的字符串/日期/系统函数
  9. MVC3 Razor语法
  10. 数据访问组件SqlHelper