专栏首页秃头哥编程Kconfig与Makefile

Kconfig与Makefile

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 # 6 7 EXTRA_CFLAGS    := -Idrivers/scsi 8 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的帮助。

本文分享自微信公众号 - 秃头哥编程(xp_1311664842)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JAVA设计模式之单例模式

    概念:java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。

    秃头哥编程
  • vsftpd添加用户并分配不同权限

    安装完后,有/etc/vsftpd/vsftpd.conf 文件,是vsftp的配置文件。

    秃头哥编程
  • 二十分钟了解Shiro登录流程

    这里截取部分代码来追踪, 为了尽可能的简单, 这里没有使用Spring等其他框架, 纯粹的Shiro代码。

    秃头哥编程
  • SAP最佳业务实践:MM–批次管理的库存物料采购(901)-1业务概览

    用途 我们的目的是描述与批次管理的库存物料采购相关的业务流程。目标组是仓库人员和财务。 处理流程中涉及的公司角色: 采购员 仓库管理员 应付会计 包含的关...

    SAP最佳业务实践
  • 卷积神经网络 第三周作业:Residual+Networks+-+v1

    Welcome to the second assignment of this week! You will learn how to build very ...

    Steve Wang
  • 《深入实践Spring Boot》阅读笔记之二:分布式应用开发

    上篇文章总结了《深入实践Spring Boot》的第一部分,这篇文章介绍第二部分:分布式应用开发,以及怎么构建一个高性能的服务平台。 主要从以下几个方面总结: ...

    情情说
  • 8.5 Spring Boot集成Swagger2构建自动化Rest API文档小结

    在以往的项目中,关于API接口文档,我们一般使用wiki或者干脆就是“线下文档”。缺点是很明显的:在迭代开发过程中,API会频繁变动,这样文档需要同步修改。繁琐...

    一个会写诗的程序员
  • 《Spring Boot极简教程》第14章 Spring Boot集成Swagger2构建自动化Rest API文档小结

    在以往的项目中,关于API接口文档,我们一般使用wiki或者干脆就是“线下文档”。缺点是很明显的:在迭代开发过程中,API会频繁变动,这样文档需要同步修改。繁琐...

    一个会写诗的程序员
  • Oracle 12c升级检查问题分析(r10笔记第69天)

    今天计划把一个测试环境升级到12c,为了练练手,先在备库上来做。数据库版本是11.2.0.3.0,计划升级到12.1.0.2.0。 为了不影响原有的测试主库,我...

    jeanron100
  • Linux下锁定账号,禁止登录系统的设置总结

    在我们运维工作中,会经常要求一些用户不允许登陆系统,以加固系统安全。今天这里介绍下锁定账号登陆的几种方法: 一、最常用方式,修改用户的shell类型为/sbin...

    洗尽了浮华

扫码关注云+社区

领取腾讯云代金券