Linux内核(1) - Kernel地图: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的帮助。

原文地址:https://www.cnblogs.com/alantu2018/p/8448769.html

时间: 2024-10-14 14:05:10

Linux内核(1) - Kernel地图:Kconfig与Makefile的相关文章

Linux内核线程kernel thread详解--Linux进程的管理与调度(十)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-02 Linux-4.5 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的描述 内核线程 为什么需要内核线程 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求). 内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的. 内核线程就是内核的分身,一个分身可以处理一件特定事情.内核线程的调度由内核负责,一个内核线程处于阻

Linux 内核(kernel)

1.内核是什么,内核是操作系统的核心.在Linux中,其实内核就是系统上面的一个文件而已,这个文件包含了驱动主机各项硬件的检测程序与驱动模块.内核文件就是在/boot 目录下以vmlinuz开头的文件,有时候会发现boot下有好几个以vmlinuz开头的文件,说明可以有多个内核,不过启动的时候只能选择一个来加载,Linux是单内核.模块化体系的.输出的三列信息分别为模块名称.占用内存大小.是否在被使用,如果第三列为0,则该模块可以随时卸载,非0则无法执行modprobe删除模块.2.查看已经加载

Linux内核系列—12.e.操作系统开发之Makefile

先来看一个简单的Makefile,我们把它放在目录/boot下,可以用来编译boot.bin和loader.bin. # Makefile for boot # Programs, flags, etc. ASM = nasm ASMFLAGS = -I include/ # This Program TARGET = boot.bin loader.bin # All Phony Targets .PHONY : everything clean all # Default starting

Linux内核配置、编译及Makefile简述

Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核.这里我用到的是linux.2.22.6版本的内核.在Linux下命令行通过tar xjf linux.2.22.6.tar.bz2解压内核.然后,如果你需要对这个内核打补丁的话,用patch命令:patch -px <../linux.2.22.6.patch.这里的px指的是忽略掉补丁文件中描述的

如何切入 Linux 内核源代码

Makefile不是Make Love 从前在学校,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉.毕业的时候,人家跟我说Makefile我完全不知,但是一说Make Love我就来劲了,现在想来依然觉得丢人. 毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件.基本上,Linux内核中每一个目录下边都会有一个 Kconfig文件和一个Makefile文件.对于一个希望能够在Linux内核的汪洋代码里看到一丝曙光的人来说,将它们放在怎么重要的地位都

Linux内核学习方法

Makefile不是Make Love 从前在学校,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉.毕业的时候,人家跟我说Makefile我完全不知,但是一说Make Love我就来劲了,现在想来依然觉得丢人. 毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件.基本上,Linux内核中每一个目录下边都会有一个Kconfig文件和一个Makefile文件.对于一个希望能够在Linux内核的汪洋代码里看到一丝曙光的人来说,将它们放在怎么重要的地位都不

Linux内核(3) - 分析内核源码如何入手(下)

下面的分析,米卢教练说了,内容不重要,重要的是态度.就像韩局长对待日记的态度那样,严谨而细致. 只要你使用这样的态度开始分析内核,那么无论你选择内核的哪个部分作为切入点,比如USB,比如进程管理,在花费相对不算很多的时间之后,你就会发现你对内核的理解会上升到另外一个高度,一个抱着情景分析,抱着0.1内核完全注释,抱着各种各样的内核书籍翻来覆去的看很多遍又忘很多遍都无法达到的高度.请相信我! 让我们在Linux社区里发出号召:学习内核源码,从学习韩局长开始! 态度决定一切:从初始化函数开始 任小强

Tiny4412 Linux 内核配置流程

1.配置交叉编译器 默认情况下,内核构建的是与宿主机相同的体系架构镜像.如果要交叉编译,需要设置两个变量ARCH和CORSS_COMPILE. ①ARCH:指明目标体系架构,如x86.arm.mips等. ②CROSS_COMPILE:指定使用的交叉编译器的前缀.例如arm-linux-.在内核顶层的Makefile中,可以看到工具链中的编译器.链接器等都是以$(CROSS_COMPILE)作为前缀. AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld

【转】6.4.6 将驱动编译进Linux内核进行测试

原文网址:http://www.apkbus.com/android-98520-1-1.html 前面几节都是将Linux驱动编译成模块,然后动态装载进行测试.动态装载驱动模块不会随着Android系统的启动而自动装载,因此Android系统每次启动都必须使用insmod或modprobe命令装载Linux驱动模块. 对于嵌入式系统(包括嵌入式Android.嵌入式Linux等)一般都采用将Linux驱动编译进内核的方式.这样做虽然没有动态装载灵活,但Linux驱动会随着Android的启动而