Kconfig和Makefile文件的学习总结

本文介绍了Linux内核配置的过程,包括使用make config或menuconfig进行配置,以及配置过程中依赖包的安装。重点讲解了Kconfig和Makefile在内核模块编译中的作用,Kconfig用于定义配置选项,而Makefile包含了编译规则。讨论了Makefile的显式和隐含规则、变量使用、文件指示、注释等内容,并概述了Kconfig的菜单结构和配置选项类型。

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

      开始接触Kconfig 文件是在内核编译时,所以首先回顾一下内核编译的过程:
      我们可以从网上下载内核源码包或者从 /usr/src 中将内核文件夹复制出来,这样做以妨直接对内核操作从而造成不可知的结果。
      接下来我们就是来配置内核,配置内核可以采用字符界面配置( make config )、或用菜单界面配置( make menuconfig ) , 另外两种由于有别的依赖条件我们暂时不讲,而我们平常用的比较多的就是菜单界面了。 进入内核目录有时直接使用 make menuconfig 命令却无法显示配置菜单,这是因为它的依赖关系还不完整,需要先用 sudo apt-get install libncurses5-dev 命令来安装它的依赖包。内核的配置菜单大致有 General setup( 大众化的设置 ) 、 File system( 文件系统 ) 、 processor type and features( 处理器类型和特征 ) 、 Device drivers( 设备驱动 ) 等等。
    再下面就是编译内核了,对于内核编译的整个过程我还是不太清楚,所以我只回顾一些涉及到的命令:
      make bzImage 这个命令的功能是生成使用 gzip 压缩的内核
      make modules modules_install 这个命令是完成内核模块的编译并安装到 /lib/modules/ 相应内核版本目录中
    编译过程还会涉及到内核的符号表文件 System.map-version 的导出。
    在使用 make config/menuconfig 时还会相应的生成 .config 配置文件,这个文件用来记录哪些部分 被编译入内核、哪些部分被编译为内核模块。

Kconfig 和 Makefile
    首先我们要明确在内核中增加程序需要完成的步骤,可归结为如下三项工作:
      将源代码文件复制到内核源代码相应目录。
      在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项。
      在目录的 Makefile 文件中增加对新源代码的编译条目,也就是书写编译规则。

关于 Makefile 文件的知识:
      首先 Makefile 它的作用是什么,通俗点讲它就是一系列编译规则的集合。
      其文件构成:显式规则、隐含规则、使用变量、文件指示、注释。

显式规则:
      一条指明了目标文件、目标文件的依赖文件、生成或更新目标文件所使用的命令。如:
       module1.o:module1.c head1.h
       gcc -c module.c -o module.o
      需要注意的是当递归编译到此时发现目标文件比依赖文件旧时会重新生成目标文件。

隐含规则:

      由 make 根据目标文件而自动推导出的规则,以及自动产生目标的依赖文件和生成目标的命令。

使用变量:
      变量的赋值符主要有 4 个: =、:=、+=、?=。值得注意的是引用变量时要注意其用法,其含义分别是递归展开、直接展开、追加赋值、条件赋值。如 obj-m += hello.o 便是用来记录编译目标的变量,其值为 .o 文件的列表,因为 obj 变量之前已经定义过了,此处采用追加赋值,将目标文件编译成模块,这些会在 .config 文件里有所记录。
      引用变量的一般方法是 $( 变量 ) ,如: CURRENT_PATH:=$(shell pwd),这里直接展开后便是 CURRENT_PATH=shell pwd ,而 shell pwd 是一条脚本命令,此时会直接执行命令得 到当前路径。
      还有一种变量是 Makefile 的预定义变量,这些变量有其特别的含义,如 CC 、 CFLAGS 、 PWD 、 AR 等。

文件指示:
      包含三部分:一是在一个 Makefile 中包含另一个 Makefile ,二是根据某些情况指定 Makefile 中的有效 部分,三是定义一个多行的命令。

注释:
      以#字符开头的行被当作注释。
伪目标的含义:
      目标文件分为实目标文件和伪目标文件,伪目标的目的不是要生成实际文件,而是为了让 make 执 行一些辅助命令,如打印信息和删除无用的中间文件等。 如:
      clean:
            -rm -f *.o
        all:
            ………

搜索目录:
      当文件所在目录发生改变后,可以不用更改 Makefile 中的规则,而只改变依赖文件的搜索目录。命令如下: vpath 模式 路径,其中模式可以表示要搜索的文件集类型,如% .h 、% .c 等。在前一次的模块编译中就使用了 make -C /usr/... M=$(...)modules 来搜索所需要的头文件目录和源文件目录。

条件语句:
    在使用 Makefile 时还可以使用条件语句,如 ifeq ( 变量 1 ,变量 2) 、或 ifneq 、以及还有 ifdef 变量名、 ifndef 。

使用库:
      在链接时如果是一般的 .o 文件则直接插入可执行文件中,如果是库文件的话则从库中找到所需的变量或函数,我们还可以定制自己的库文件,如: mylib:mylib( 成员名 )

关于 Kconfig 文件的知识:

    菜单入口:
     config 关键字字义新的配置选项,配置选项的属性包括类型、数据范围、输入提示、依赖关系 ( 或反向依赖 ) 、帮助信息和默认值。
      类型包括: bool 、 tristate 、 string 、 hex 、 int 。
      输入提示: prompt “...”
      依赖关系: depends on … 、 select … 。
      数值范围: range symbol symbol
      帮助信息:以 help (--help--) 开始

说明:
      menuconfig 关键字的作用与 config 类似,但它在 config 的基础上要求所有子选项作为独立的行显示。

菜单结构:
      有两各方式来确定菜单结构,一是以如下方式:
        menu …/ 菜单名
        depends on ...
        config … /菜单入口
        …………
        endmenu
      另一种则是根据依赖关系生成菜单结构,如果菜单选项在一定程度上依赖于前面的选项,它就能成为该选项的子菜单。如果父选项为 N ,则子选项不可见,如果父选项为 Y 或 M ,则子选项可见,如 Makefile 文件中的 obj-$(CONFIG_...) +=*.o, 这里往往采用变量引用来根据情况确定是编译入内核( Y )、不编译( N )、编译成模块( M )。

实例
      在实例操作中,我们在相应内核源代码 drivers 目录下新增了驱动目录后,为子目录创建了 Kconfig 和 Makefile 文件的同时一定要修改父目录中的 Kconfig( 如加 source “...” 来完成引用 ) 和 Makefile 文件,以便这两个新增文件能被引用,如果 test 驱动目录中包含子菜单选项,也就是其中有菜单的依赖关系,此时子菜单的显示与否由配置变量来确定是 Y 、 M 、 N 。
      test 目录下的 Makefile 文件就会根据配置变量的取值来构建 obj-* 列表,而配置变量可以由用户是否 选择图形菜单下的相应项来确定其值。
      obj 列表也可以是目录,例如 test 下包含 cpu 子目录,则会根据 TEST_CPU 是否等于 y ,等于则会执行 obj-y +=cpu/ ,而此时cpu 目录下也要有相应的 Makefile 文件来编译相应源文件。同时,对于 test 目录也要将 test/ 目录追加到其父目录的 Makefile 文件中以使其能被编译命令作用到并能进入 test 目录。总体上来讲就是你添加了子目录后一定要让其父目录中的 Kconfig 和 Makefile 文件知道,并且能够引用,到此,基本上完成父目录和子目录下的 Kconfig 和 Makefile 文件的修改说明。

### 回答1: kconfigmakefile是两个不同的工具,但它们之间有着密切的关系。 kconfig是一个配置工具,用于生成Linux内核的配置文件。它可以帮助用户选择需要编译进内核的模块驱动程序,以及配置内核的各种选项。 makefile是一个构建工具,用于自动化构建编译软件项目。它可以根据项目的依赖关系规则,自动化地构建编译项目。 在Linux内核的构建过程中,kconfigmakefile是紧密结合的。kconfig生成的配置文件会被makefile读取,根据配置文件中的选项模块信息,自动化地构建编译内核。因此,kconfigmakefile是Linux内核构建过程中不可或缺的两个工具。 ### 回答2: kconfigmakefile是Linux开发中两个非常重要的工具。kconfig是Linux内核的配置工具,而makefile则是一种用于编译程序的脚本语言,在Linux内核其他Linux软件项目中广泛使用。 在Linux内核的开发中,kconfig用于配置内核的选项,包括驱动程序、系统功能硬件支持等。kconfig会生成一个.config文件,保存了内核的配置信息。这个文件会被makefile所使用,makefile会根据这个配置文件来编译内核。 makefile会通过读取.config文件来确定内核需要编译哪些模块。在这个过程中,makefile会分析每个模块的依赖关系,确定模块的编译顺序,并生成相应的命令来编译内核。 因为kconfigmakefile密切相关,它们在很多方面是相互影响的。例如,如果在.config文件中没有选择一个模块,那么makefile就不会编译这个模块。另外,如果一个模块发生了改变,makefile会检测这个改变并重新编译这个模块。 在实际开发中,kconfigmakefile是相互依赖的。如果没有kconfig来配置内核选项,makefile就不能编译内核。另外,如果没有makefile来编译内核,kconfig生成的配置文件也就没有用处。 总之,kconfigmakefile是Linux内核开发过程中不可或缺的两个工具。它们在内核编译过程中扮演着非常重要的角色,并且经常需要协同工作来确保内核的正确编译配置。 ### 回答3: kconfigmakefile是Linux内核编译过程中的两个重要工具,它们分别负责内核配置编译。它们的关系可以用以下的流程来解释: 1. 内核开发者使用kconfig工具来配置内核,配置完成后会生成.config文件。 2. makefile会读取.config文件,根据其中的配置信息采取相应的编译动作。如果.config文件中指定了某个驱动程序需要编译,makefile会自动查找该程序的源代码文件并进行编译。 3. makefile在编译过程中也会读取其他的配置文件源代码文件,并将它们进行编译链接生成目标文件。 4. 最后,makefile会根据目标文件生成可执行文件。如果生成的是内核镜像,makefile会将可执行文件转换为内核镜像,并将其拷贝到启动设备上。 从以上流程中可以看出,kconfigmakefile是密不可分的工具,它们共同协作完成内核的配置编译。kconfig负责对内核选项进行配置,而makefile则根据这些配置信息进行编译链接。因此,熟练掌握kconfigmakefile的使用方法是Linux内核开发者必须掌握的技能之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值