当我们编写完一个驱动后,我们要把它以模块形式编译或者直接编译进内核时,需要修改相关文件,其中最重要的便是kconfig ,makefile。主要是分析一下三者之间的关系,然后就其语法简要的谈一下。当我们在内核源码目录下执行make (或者make menuconfig等命令)命令时,实际上是根据makefile 来进行编译的。我在mini2440开发板上编写了一个按键控制led灯的驱动。文件名为buttons_leds_zhao.c属于字符驱动。因此在/driver/char/目录下的makefile部分最后添加一行

obj-$(CONFIG_BUTTONS_LEDS_ZHAO)      += buttons_leds_zhao.o

如下:

obj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o tty_buffer.o tty_port.o

obj-$(CONFIG_BFIN_JTAG_COMM)    += bfin_jtag_comm.o

obj-$(CONFIG_CONSOLE_TRANSLATIONS) += consolemap.o consolemap_deftbl.o

obj-$(CONFIG_HW_CONSOLE) += vt.o defkeymap.o

obj-$(CONFIG_AUDIT) += tty_audit.o

obj-$(CONFIG_BUTTONS_LEDS_ZHAO)  += buttons_leds_zhao.o

其中第一行obj-y  中的y表示编译进内核,而obj-$(CONFIG_LEGACY_PTYS)  中CONFIG_LEGACY_PTYS则表示一个变量,类似于我们C语言中的变量,用$( )来表示,它一般可以取三种值y ,m ,n.y表示编译进内核,而m则表示以模块的方式进行编译,n表示不编译进内核。obj-y    += 等号后面的.o后缀文件则是由该目录下的对应名称的.c文件编译而来。

而上面CONFIG_LEGACY_PTYS变量的取值则是通过.config文件来集中赋值的。.config部分内容如下

# Character devices 

CONFIG_VT=y

CONFIG_CONSOLE_TRANSLATIONS=y

CONFIG_VT_CONSOLE=y

CONFIG_HW_CONSOLE=y

# CONFIG_VT_HW_CONSOLE_BINDING is not set

# CONFIG_DEVKMEM is not set

CONFIG_MINI2440_HELLO_MODULE=m

CONFIG_BUTTONS_LEDS_ZHAO=m

CONFIG_LEDS_MINI2440=m

CONFIG_MINI2440_BUTTONS=m

CONFIG_MINI2440_BUZZER=y

CONFIG_MINI2440_ADC=y

# CONFIG_SERIAL_NONSTANDARD is not set

从上面几行我们可以看到,在makefile里面的变量都是在.config中赋值的。当我们在源代码目录下输入make命令时,都是默认从.config中读入。因此,在输入make之前,用ls  -a 查看一下是否有该文件。对于只包含几个文件的工程来说,手动写.config和makefile并不是一件很难的事情,但如果是一个包含有几百个文件的项目来说,则是一件比较困难的事情。可以用autoconf来自动生成.config,automake来制作makefile。看起来问题是解决的,但实际上,这种做法缺乏一定的灵活性,不能实现按需定制的要求。如果要添加或删掉某个驱动,将要在.config文件中找到相应的项进行修改。非常的不方便。因此,便出现了kconfig。

当我们在内核源码目录下输入make menuconfig时,出现如下内容:

.config - Linux Kernel v2.6.32.2 Configuration 
──────────────────────────────────────────────────────────────────────────────────────────────────
┌──────────────────────────────── Linux Kernel Configuration ─────────────────────────────────┐ 
│  Arrow keys navigate the menu.  <Enter> selects submenus --->.  Highlighted letters are     │ 
│  hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> │ 
│  to exit, <?> for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module     │ 
│  < > module capable                                                                         │ 
│ ┌─────────────────────────────────────────────────────────────────────────────────────────┐ │ 
│ │             General setup  --->                                                         │ │ 
│ │         [*] Enable loadable module support  --->                                        │ │ 
│ │         -*- Enable the block layer  --->                                                │ │ 
│ │             System Type  --->                                                           │ │ 
│ │             Bus support  --->                                                           │ │ 
│ │             Kernel Features  --->                                                       │ │ 
│ │             Boot options  --->                                                          │ │ 
│ │             CPU Power Management  --->                                                  │ │ 
│ │             Floating point emulation  --->                                              │ │ 
│ │             Userspace binary formats  --->                                              │ │ 
│ │             Power management options  --->                                              │ │ 
│ │         [*] Networking support  --->                                                    │ │ 
│ │             Device Drivers  --->                                                        │ │ 
│ │             File systems  --->                                                          │ │ 
│ └─────────┴(+)────────────────────────────────────────────────────────────────────────────┘ │ 
├─────────────────────────────────────────────────────────────────────────────────────────────┤
│                              <Select>    < Exit >    < Help >                               │ 
└─────────────────────────────────────────────────────────────────────────────────────────────┘

它是通过读取在内核源码目录下的Kconfig文件来配置的。在/drivers/char/下的目录kconfig部分内容如下:

config DEVKMEM 
        bool "/dev/kmem virtual device support" 
        default y 
        help 
          Say Y here if you want to support the /dev/kmem device. The 
          /dev/kmem device is rarely used, but can be used for certain 
          kind of kernel debugging operations. 
          When in doubt, say "N".

config MINI2440_HELLO_MODULE 
        tristate "Mini2440 module sample" 
        depends on MACH_MINI2440 
        default m if MACH_MINI2440 
        help 
          Mini2440 module sample.

config BUTTONS_LEDS_ZHAO 
        tristate "Mini2440 button  and leds sample" 
        depends on MACH_MINI2440 
        default m if MACH_MINI2440 
        help 
          Mini2440  button and leds  module sample.

其具体语法格式说明如下:

config关键字是一个新的配置选项的入口     其后的选项MINI2440_HELLO_MODULE省略了CONFIG。完整的表示为CONFIG_MINI2440_HELLO_MODULE,也即是当我们将该选项设置成y时,它将自动的将.config的CONFIG_MINI2440_HELLO_MODULE=m改写成CONFIG_MINI2440_HELLO_MODULE=y。

紧接着的是菜单的属性 最主要的有2种tristate ,boolean 。tristate表示三态:编译进内核(y),编译成模块(m),不编译(n)。boolean 主要有两种y或ndepend则表示依赖项  default缺省的编译选项 m表示默认该文件表示以模块方式编译。后面的help是帮助信息,当我们选中help菜单时就可以看见,它不是必需的。随着操作系统升级,编译选项

达到几千个。对于一般人来说,要搞清每一个选项是很困难的,一般很多选项都是默认的。

总的来说,三者之间的关系如下:当我们在内核源码目录下输入makemenuconfig时,在出现的菜单界面中选择一项时,它会自动跟新.config相应项的值。如果我们没有选择,则会在.config问下插入一行注释。类似于# CONFIG_SERIAL_NONSTANDARD is not set,当我们输入make时,根据makefile文件来编译,makefile文件中的变量值则由.config来进行赋值操作。仅仅只在kconfig中添加选项,只会在菜单界面中显示,即使此时选择y或m,也不会编译文件。还需要在makefile文件中按照规定添加相应行才能进行编译。简单图解如下:

kconfig------->.config---------->makefile

.config 和 kconfig以及 makefile的关系相关推荐

  1. Android编译系统中的Kconfig,Makefile,.config编译系统浅析

    在对Android进行编译时,用的就是Linux下的Makefile和Kconfig编译系统,对整个系统进行编译.当然还包括很多配置命令,比如make defconfig, make oldconfi ...

  2. 解析linux内核中makefile,.config以及Kconfig的作用

    申明,下面这篇文章是原文,本文参考了这篇文章,这篇文章分析得比较透彻,下面是链接. https://zhuanlan.zhihu.com/p/28461589 首先我们要知道makefile文件是什么 ...

  3. Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

    前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式--在一个独立的文件夹通过makefile配合内核源码路径完成   那么如何将驱动直接编译进内核 ...

  4. linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解-转

    前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式--在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核呢? ...

  5. 【学习笔记】编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译

    本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...

  6. KConfig、Makefile详解以及ARM平台Linux内核的编译

    本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...

  7. enc28j60 linux 驱动_enc28j60网卡驱动模块添加进Linux内核,Kconfig,Makefile配置过程...

    这里是要把 http://www.linuxidc.com/Linux/2017-02/140819.htm 中的enc28j60网卡驱动模块,添加到2.6.22.6内核中,这个模块代码不需要任何修改 ...

  8. 编译arm linux内核,编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译...

    转载自:http://blog.csdn.net/newthinker_wei/article/details/8022696 本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录, ...

  9. Linux内核源码树学习:Kconfig和Makefile

    Linux内核源码树的每个目录下都有两个文档Kconfig和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单 ...

最新文章

  1. 实战:基于OpenCV实现偏斜文档校正
  2. 【opencv】VideoCapture打不开本地视频文件或者网络IP摄像头
  3. mysql text类型 使用方法_MySQL使用TEXT/BLOB类型的知识点详解
  4. C语言 指针与数组
  5. MyApplicationToast工具类
  6. TCPMP-interface相关文件函数解析 -about.c
  7. 刻录linux-iso至u盘工具,ISO USB刻录工具ISO to USB burning tool V1.5 完美版
  8. 移动端证件识别,支持离线识别
  9. 一个不简单的Procedure body例子
  10. 永洪科技发布Yonghong Z-Suite V7.5 重新定义大数据驱动业务增长成功标准
  11. 微信小程序 延时执行 设置固定时间间隔
  12. AlphaStar 实战技巧分析
  13. html怎么设置毛笔字体,三种实用的毛笔书法字体设计制作教程
  14. 脑卒中css评分是什么意思,你知道房颤卒中新评分—ABC评分量表吗?
  15. 今天是2019年大年三十儿,写了几幅字,给大家拜个年啦
  16. STM32 PWM周期与频率的计算
  17. 原生js实现字幕滚动
  18. [WikiOI] 2.3.3 素数判定
  19. intellij idea、notepad++、Google浏览器以及Windows 10系统修改背景为豆沙绿护眼色
  20. leelen可视对讲怎么接线_电梯对讲系统解决方案

热门文章

  1. Ant Design Pro 登录超时处理
  2. windows 下cmd命令行的替换工具cmder
  3. 【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念
  4. Linux中常用命令(文件与目录)
  5. 担当大任者的九大特征
  6. JQuery学习记录——DOM的加载
  7. 我的20132014
  8. java 调用r语言包传参数_Java与R语言的配置,调用
  9. etlgr是什么服务器_ETL是指什么 - 金融行业 - ITPUB论坛-中国专业的IT技术社区
  10. java面向对象程序设计董小园_java面向对象程序设计(董小园版).doc