内核源码树的目录下都有两个文件Kconfig和Makefile。分布到各目录的Kconfig构成了一个分布式的内核配置数据库

每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出菜单,

用户选择后保存到.config的内核配置文件中。

在内核编译时,主Makefile调用这个.config,就知道了用户的选择。

上面的内容说明了,Kconfig就是对应着内核的配置菜单。

如果要想添加新的驱动到内核的源码中,可以修改Kconfig,这样就可以选择这个驱动,如果想使这个驱动被编译,要修改Makefile

所以添加新的驱动时需要修改的文件有两种(注意不只是两个)

*Kconfig

*Makefile

要想知道怎么修改这两种文件,就要知道两种文件的语法结构

Kconfig

每个菜单都有一个关键字标识,最常见的就是config

语法:

config <symbol>

<config options>

symbol是一个新的标记的菜单项,options是在这个新的菜单项下的属性和选项

其中options部分有:

1、类型定义:

每个config菜单项都要有类型定义,bool布尔类型、 tristate三态:内建、模块、移除 string字符串、 hex十六进制、 integer整型

例如

config HELLO_MODULE

bool "hello test module"

bool类型的只能选中或不选中

tristate类型的菜单项多了编译成内核模块的选项,如果选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,

如果选择内建,就是直接编译成内核镜像,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.

详细配置

n, 表示默认不编译

y,表示默认编译进内核

m,表示默认编译为模块

2、依赖型定义depends on或requires

指此菜单的出现与否依赖于另一个定义

config HELLO_MODULE

bool "hello test module"

depends on ARCH_PXA

这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效。

3、帮助性定义

只是增加帮助用关键字

help或者---help---

内核的Makefile

在linux2.6.x/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。

内核的Makefile分为5个组成部分:

 

(1)Makefile 最顶层的Makefile

(2).config 内核的当前配置文件,编译时成为定层Makefile的一部分
 

(3)arch/$(ARCH)/Makefile 与体系结构相关的Makefile

 

(4)s/ Makefile.* 一些Makefile的通用规则 (这里的s指 “scripts”,by imjacob)

(5)kbuild Makefile 各级目录下的大概约500个文件,编译时根据上层Makefile传下来的宏定义和其他编译规则,将源代码编译成模块或者编入内核

顶层的Makefile文件读取 .config文件的内容,并总体上负责build内核和模块。Arch Makefile则提供补充体系结构相关的信息。

s目录下的Makefile文件包含了所有用来根据kbuild Makefile 构建内核所需的定义和规则。

(其中.config的内容是在make menuconfig的时候,通过Kconfig文件配置的结果。

举个例子:

假设想把自己写的一个flash的驱动程序加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?

可以分三步:

第一:将你写的hello.c 文件添加到/drivers/char/ hello目录下。

第二:修改/drivers/char/ hello目录下的kconfig文件:

config HELLO_MODULE
tristate "hello-tristate"
default y
help
        this is help test

这样当make menuconfig时 ,将会出现 hello-tristate选项。

第三:修改该目录下makefile文件。

添加如下内容:

obj-$(CONFIG_HELLO_MODULE) += hello.o

修改上层目录/drivers/char中Kconfig文件

这样,当你运行make menucofnig时,你将发现 hello-tristate选项,如果你选择了此项。

该选择就会保存在.config文件中。体现为

这将是在hello/Makefile中

obj-$(CONFIG_HELLO_MODULE) += hello.o

等价为

obj-y += hello.o

系统在调用hello下的makefile 时,将会把 hello.o 加入到内核中。即可达到你的目的。

测试Kconfig不同的类型:

Kconfig文件:

  1. config HELLO_MODULE
  2. tristate "hello-tristate"
  3. default y
  4. help
  5. this is help test
  6. config HELLO_MODULE2
  7. bool "hello-bool"
  8. default y
  9. help
  10. this is help test
  11. config HELLO_MODULE3
  12. string "helllo-string"
  13. default "str-test"
  14. config HELLO_MODULE4
  15. hex "hello-hex"
  16. config HELLO_MODULE5
  17. int "hello-int"

Linux-----Kconfig文件的简介的更多相关文章

  1. Linux 文件系统 -- 文件权限简介

    一.文件权限 使用 ls -l 命令可以查看文件的具体属性: 如图所示,第一列所示告诉了用户一个文件的类型和权限信息: 1)第一个字符 "d",表明该文件是一个目录文件: 2)r ...

  2. linux驱动编写(Kconfig文件和Makefile文件)

    在Linux编写驱动的过程中,有两个文件是我们必须要了解和知晓的.这其中,一个是Kconfig文件,另外一个是Makefile文件.如果大家比较熟悉的话,那么肯定对内核编译需要的.config文件不陌 ...

  3. Linux 编译kernel有关Kconfig文件详解

    ref : https://blog.csdn.net/Ultraman_hs/article/details/52984929 Kconfig的格式 下面截取/drivers/net下的Kconfi ...

  4. Linux源码Kconfig文件语法分析

    Kconfig是我们进行内核配置的关键文件,用于生成menuconfig的界面并生成最终确定编译选项的.config文件.关于Kconfig文件的编写规则,在Documentation/kbuild/ ...

  5. Linux - 日志文件简介

    Linux日志文件绝大多数存放在/var/log目录,其中一些日志文件由应用程序创建,其他的则通过syslog来创建. Linux系统日志文件通过syslog守护程序在syslog套接字/dev/lo ...

  6. (转载)使用 udev 高效、动态地管理 Linux 设备文件

    概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 eth0, eth1, sda, sdb 等等.通过观察这些设备的内核设备名称,用户通常能知道这些是什么类型的设备,但是不知道哪一个设备是 ...

  7. 嵌入式 使用udev高效、动态地管理Linux 设备文件

    本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本文会使那 ...

  8. 【转】使用 udev 高效、动态地管理 Linux 设备文件

    简介: 本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本 ...

  9. linux 下文件误删恢复

    linux 下文件误删恢复 0x01 事件背景 某天晚上写代码的时候,本来想删除当前目录下一个叫xxx的文件夹 rm -rdf ./xxx/*, 结果光顾着和人说话,一不留神手贱把命令敲成了rm -r ...

  10. 使用 udev 高效、动态地管理 Linux 设备文件

    本文转自:https://www.ibm.com/developerworks/cn/linux/l-cn-udev/index.html 概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 ...

随机推荐

  1. HTML5地理定位-Geolocation API

    HTML5提供了一组Geolocation API,来自navigator定位对象的子对象,获取用户的地理位置信息Geolocation API使用方法:1.判断是否支持 navigator.geol ...

  2. PHP:Mysql判断KEY是否存在 如果存在走修改 如果不存在走添加

    文章来源:http://www.cnblogs.com/hello-tl/p/7738113.html 0.PHP代码 <?php /** * POST 传参 * * 例子 添加修改 使用同一个 ...

  3. A - 栈

    Description   You are given a string consisting of parentheses () and []. A string of this type is s ...

  4. Selenium打开谷歌浏览器提示chromedriver.exe停止运行且浏览器显示请关闭开发者模式

    提示关闭开发者模式,其实是chromedriver.exe与chrome 浏览器版本不一致导致的, 查看浏览器版本方法  在浏览框输入,chrome://version/. 显示是 Google Ch ...

  5. git详细说明

    https://www.cnblogs.com/qcloud1001/p/9796750.html

  6. Leetcode 179.最大数

    最大数 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 impo ...

  7. 全文索引(A-1)-用户数据收集(用户研究)

    推荐系统根据用户的信息和历史行为记录,构造出用户的个性化模型,再依据特定的推荐算法,向用户推荐其可能感兴趣的项目. 如何获取用户的偏好? 建议用户对一些指定项目进行评分,如对:小说.传记.技术书.图画 ...

  8. POJ 2096 找bug 期望dp

    题目大意: 一个人受雇于某公司要找出某个软件的bugs和subcomponents,这个软件一共有n个bugs和s个subcomponents,每次他都能同时随机发现1个bug和1个subcompon ...

  9. [luoguP2617] Dynamic Ranking(树状数组 套 主席树 + 离散化)

    传送门 BZOJ上是权限题,洛谷赞啊. 求区间 K 大数很简单. 但是如果修改某个数的话,那么就得把这个数及后面所建的主席树都更新一遍 nlogn,显然不行. 所以可以在外面套一个树状数组来优化,树状 ...

  10. 【BZOJ4868】期末考试(整数三分)

    题意: 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天 或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有公布,他就会等待 ...