那年,我学习《Linux内核修炼之道》——Kernel地图:Kconfig与Makefile

本文深入解析Linux内核驱动开发中Kconfig和Makefile的作用,提供如何利用它们快速定位目标代码的方法。通过具体实例展示如何在庞大的Linux内核源码中高效导航,为Linux内核开发者提供实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



这些文章是阅读《linux内核修炼之道》的笔记和一些自己补充的知识和感悟,写的不清楚的地方请查看《linux内核修炼之道》等资料。同时文章若有不妥的地方请大家指出,谢谢。

转载请注明出处:http://blog.youkuaiyun.com/muge0913/article/details/7250425


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的帮助。








这些文章是阅读《linux内核修炼之道》的笔记和一些自己补充的知识和感悟,写的不清楚的地方请查看《linux内核修炼之道》等资料。同时文章若有不妥的地方请大家指出,谢谢。

转载请注明出处:http://blog.youkuaiyun.com/muge0913/article/details/7250425






                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值