转自:http://blog.csdn.net/fudan_abc/article/details/5340408

Makefile不是Make Love

从前在学校,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉。毕业的时候,人家跟我说Makefile我完全不知,但是一说Make Love我就来劲了,现在想来依然觉得丢人。

毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件。基本上,Linux内核中每一个目录下边都会有一个Kconfig文件和一个Makefile文件。 对于一个希望能够在Linux内核的汪洋代码里看到一丝曙光的人来说,将它们放在怎么重要的地位都不过分。

我们去香港,通过海关的时候,总会有免费的地图和各种指南拿,有了它们在手里我们才不至于无头苍蝇般迷惘的行走在陌生的街道上。即使在内地出去旅游的时候一般来说也总是会首先找份地图,当然了,这时就是要去买了,拿是拿不到的,不同的地方有不同的特色, 只不过有的特色是服务,有的特色是索取。

Kconfig和Makefile就是Linux Kernel迷宫里的地图。地图引导我们去认识一个城市,而Kconfig和Makefile则可以让我们了解一个Kernel目录下面的结构。我们每次浏览kernel寻找属于自己的那一段代码时,都应该首先看看目录下的这两个文件。 

利用Kconfig和Makefile寻找目标代码

就像利用地图寻找目的地一样,我们需要利用Kconfig和Makefile来寻找所要研究的目标代码。

比如我们打算研究U盘驱动的实现,因为U盘是一种storage设备,所以我们应该先进入到drivers/usb/storage/目录。但是该目录下的文件很多,那么究竟哪些文件才是我们需要关注的?这时就有必要先去阅读Kconfig和Makefile文件。

对于Kconfig文件,我们可以看到下面的选项。

34 config USB_STORAGE_DATAFAB 

35         bool "Datafab Compact Flash Reader support (EXPERIMENTAL)" 

36        depends on USB_STORAGE && EXPERIMENTAL 

37        help 

38          Support for certain Datafab CompactFlash readers. 

39          Datafab has a web page at <http://www.datafabusa.com/>.

显然,这个选项和我们的目的没有关系。首先它专门针对Datafab公司的产品,其次虽然CompactFlash reader是一种flash设备,但显然不是U盘。因为drivers/usb/storage目录下的代码是针对usb mass storage这一类设备,而不是针对某一种特定的设备。U盘只是usb mass storage设备中的一种。再比如:

101 config USB_STORAGE_SDDR55 

102         bool "SanDisk SDDR-55 SmartMedia support (EXPERIMENTAL)" 

103         depends on USB_STORAGE && EXPERIMENTAL 

104         help 

105             Say Y here to include additional code to support the Sandisk SDDR-55 

106             SmartMedia reader in the USB Mass Storage driver.

很显然这个选项是有关SanDisk产品的,并且针对的是SM卡,同样不是U盘,所以我们也不需要去关注。

事实上,很容易确定,只有选项CONFIG_USB_STORAGE才是我们真正需要关注的。

9 config USB_STORAGE 

10      tristate "USB Mass Storage support" 

11       depends on USB && SCSI 

12      ---help--- 

13        Say Y here if you want to connect USB mass storage devices to your 

14        computer's USB port. This is the driver you need for USB 

15        floppy drives, USB hard disks, USB tape drives, USB CD-ROMs, 

16        USB flash devices, and memory sticks, along with 

17        similar devices. This driver may also be used for some cameras 

18        and card readers. 

19 

20        This option depends on 'SCSI' support being enabled, but you 

21          probably also need 'SCSI device support: SCSI disk support' 

22        (BLK_DEV_SD) for most USB storage devices. 

23 

24        To compile this driver as a module, choose M here: the 

25        module will be called usb-storage.

接下来阅读Makefile文件。

0 # 

1 # Makefile for the USB Mass Storage device drivers. 

2 # 

3 # 15 Aug 2000, Christoph Hellwig 

4 # Rewritten to use lists instead of if-statements. 

5 # 



7 EXTRA_CFLAGS    := -Idrivers/scsi 



9 obj-$(CONFIG_USB_STORAGE)    += usb-storage.o 

10 

11 usb-storage-obj-$(CONFIG_USB_STORAGE_DEBUG)    += debug.o 

12 usb-storage-obj-$(CONFIG_USB_STORAGE_USBAT)    += shuttle_usbat.o 

13 usb-storage-obj-$(CONFIG_USB_STORAGE_SDDR09)    += sddr09.o 

14 usb-storage-obj-$(CONFIG_USB_STORAGE_SDDR55)    += sddr55.o 

15 usb-storage-obj-$(CONFIG_USB_STORAGE_FREECOM)    += freecom.o 

16 usb-storage-obj-$(CONFIG_USB_STORAGE_DPCM)    += dpcm.o 

17 usb-storage-obj-$(CONFIG_USB_STORAGE_ISD200)    += isd200.o 

18 usb-storage-obj-$(CONFIG_USB_STORAGE_DATAFAB)    += datafab.o 

19 usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT)    += jumpshot.o 

20 usb-storage-obj-$(CONFIG_USB_STORAGE_ALAUDA)    += alauda.o 

21 usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH)    += onetouch.o 

22 usb-storage-obj-$(CONFIG_USB_STORAGE_KARMA)    += karma.o 

23 

24 usb-storage-objs :=    scsiglue.o protocol.o transport.o usb.o / 

25              initializers.o $(usb-storage-obj-y) 

26 

27 ifneq ($(CONFIG_USB_LIBUSUAL),) 

28      obj-$(CONFIG_USB)    += libusual.o 

29 endif

前面通过Kconfig文件的分析,我们确定了只需要去关注CONFIG_USB_STORAGE选项。在Makefile文件里查找CONFIG_USB_STORAGE,从第9行得知,该选项对应的模块为usb-storage。

因为Kconfig文件里的其他选项我们都不需要关注,所以Makefile的11~22行可以忽略。第24行意味着我们只需要关注scsiglue.c、protocol.c、transport.c、usb.c、initializers.c以及它们同名的.h头文件。

Kconfig和Makefile很好的帮助我们定位到了所要关注的目标,就像我们到一个陌生的地方要随身携带地图,当我们学习Linux内核时,也要谨记寻求Kconfig和Makefile的帮助。

《Linux内核修炼之道》精华分享与讨论(5)——Kernel地图:Kconfig与Makefile的更多相关文章

  1. linux内核修炼之道

    华清远见·任桥伟   人民邮电 2010 内核不学,岂能理解?今天开始正式学习内核原理 linux 发行版本Mint. cat  /etc/issue     # sudo lsb_release - ...

  2. linux 内核修炼之道——系统调用

    1.问:什么是系统调用? 用户应用程序访问并使用内核所提供的各种服务的途径即是系统调用,也称系统调用接口层. 2.问:为什么需要系统调用? ① 系统调用作为内核和应用程序之间的中间层,扮演了一个桥梁角 ...

  3. 《Linux内核修炼之道》 之 高效学习Linux内核

    http://blog.csdn.net/fudan_abc/article/details/5738436

  4. 《Linux内核修炼之道》 系列

    http://blog.csdn.net/fudan_abc/article/category/655796

  5. Linux驱动修炼之道-SPI驱动框架源码分析(上)【转】

    转自:http://blog.csdn.net/lanmanck/article/details/6895318 SPI驱动架构,以前用过,不过没这个详细,跟各位一起分享: 来自:http://blo ...

  6. Linux内核学习之道

    来自:http://blog.chinaunix.net/uid-26258259-id-3783679.html 内核文档 内核代码中包含有大量的文档,这些文档对于学习理解内核有着不可估量的价值,记 ...

  7. Linux运维40道精华题

    题目 1.什么是运维?什么是游戏运维? 1)运维是指大型组织已经建立好的网络软硬件的维护,就是要保证业务的上线与运作的正常,在他运转的过程中,对他进行维护,他集合了网络.系统.数据库.开发.安全.监控 ...

  8. Linux驱动修炼之道-RTC子系统框架与源码分析【转】

    转自:http://helloyesyes.iteye.com/blog/1072433 努力成为linux kernel hacker的人李万鹏原创作品,为梦而战.转载请标明出处 http://bl ...

  9. Linux内核修炼之framebuffer分析

    Linux源代码包中/document/fb/framebuffer.txt有例如以下介绍: The frame buffer device provides an abstraction for t ...

随机推荐

  1. 树状数组求最大值 (RMQ with Shifts)

    代码: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib ...

  2. logstash+es+kibana+redis搭建

    环境信息: CentOS 6.5 redis 3.0.4 logstash elasticsearch kibana 服务端ip:192.168.0.65 客户端ip:192.168.0.66 关系结 ...

  3. Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.1

    Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.1 http://blog.csdn.net/sunbow0 Spark ML ...

  4. 【LeetCode with Python】 Sort List

    博客域名:http://www.xnerv.wang 原题页面:https://oj.leetcode.com/problems/sort-list/ 题目类型: 难度评价:★ 本文地址:http:/ ...

  5. GuozhongCrawler系列教程 (1) 三大PageDownloader

    GuozhongCrawler  QQ群 202568714 教程源代码下载地址:http://pan.baidu.com/s/1pJBmerL GuozhongCrawler内置三大PageDown ...

  6. PHP debug_backtrace() 函数

    PHP Error 和 Logging 函数 实例 生成 PHP backtrace: <?php function a($txt) { b("Glenn"); } func ...

  7. linux查看是否安装JDK(转载)

    rpm -qa |grep java 看是否安装了java echo $PATH 看环境变量是否配置了java路径 find / -name java 查找java文件 一般linux服务器会自带jd ...

  8. Spring mvc接受集合类型参数的方法

    public String xxxxx(String xxxx, String xxxxx, @RequestParam("parameterList[]") List<St ...

  9. 2018.11.23-day26 面向对象(终结)

    1.私有成员不能被继承2.装饰器方法--(类方法&静态方法)3.装饰器--property方法4.反射

  10. Java NIO 粘包 拆包 (实战) - 史上最全解读

    疯狂创客圈 Java 聊天程序[ 亿级流量]实战系列之13 [博客园 总入口 ] 本文的源码工程:Netty 粘包/半包原理与拆包实战 源码 本实例是<Netty 粘包/半包原理与拆包实战> ...