浅谈内核的Makefile、Kconfig和.config文件
Linux内核源码文件繁多,搞不清Makefile、Kconfig、.config间的关系,不了解内核编译体系,编译修改内核有问题无从下手,自己写的驱动不知道怎么编进内核,不知道怎么配置内核,这些问题都和Makefile、Kconfig、.config有关,下面简单谈谈Makefile、Kconfig和.config。希望对你有启发。
三者的作用:
简单来说就是去饭店点菜:Kconfig是菜单,Makefile是做法,.config就是你点的菜。
Makefile:一个文本形式的文件,编译源文件的方法。
Kconfig:一个文本形式的文件,内核的配置菜单。
.config:编译内核所依据的配置。
三者的语法
Makefile
参考:linux-3.4.2/drivers/Makefile
作用:用来定义哪些内容作为模块编译,哪些条件编译等。子目录Makefile被顶层Makefile包含。
(1)直接编译
obj-y += xxx.o
表示由xxx.c或xxx.s编译得到xxx.o并直接编进内核。
(2)条件编译
obj -$(CONFIG_HELLO) += xxx.o
根据.config文件的CONFIG_XXX来决定文件是否编进内核。
(3)模块编译
obj-m +=xxx.o
表示xxx作为模块编译,即执行make modules时才会被编译。
2、Kconfig
每个config菜单项都有类型定义: bool布尔类型、 tristate三态(内建、模块、移除)、string字符串、 hex十六进制、integer整型。
作用:决定make menuconfig时展示的菜单项,
参考:linux-3.4.2/drivers/leds/ kconfig:
config LEDS_S3C24XX
tristate "LED Support for Samsung S3C24XX GPIO LEDs"
depends on LEDS_CLASS
depends on ARCH_S3C24XX
help
This option enables support for LEDs connected to GPIO lines
on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440.
LEDS_S3C24XX:配置选项的名称,省略了前缀"CONFIG_"
Tristate:
表示该项是否编进内核、编成模块。显示为< > , 假如选择编译成内核模块,则会在.config中生成一个 CONFIG_HELLO_MODULE=m的配置,选择Y就是直接编进内核,会在.config中生成一个 CONFIG_HELLO_MODULE=y的配置项。Tristate后的字符串是make menuconfig时显示的配置项名称。
bool:
此类型只能选中或不选中,make menuconfig时显示为[ ],即无法配置成模块。
dependon:
该选项依赖于另一个选项,只有当依赖项被选中时,当前配置项的提示信息才会出现,才能设置当前配置项。
select:
反向依赖关系,该选项选中时,同时选中select后面定义的那一项。
help:
帮助信息。
目录层次迭代 :
Kconfig中有类似语句:source "drivers/usb/Kconfig" ,用来包含(或嵌套)新的Kconfig文件,使得各个目录管理各自的配置内容,不必把那些配置都写在同一个文件里,方便修改和管理。
3、.config
参考:linux-3.4.2/.config
通过前俩个文件的分析,.config的含义已经很清晰:内核编译参考文件,查看里面内容可以知道哪些驱动被编译进内核。
配置内核方式有3种(任选其一):
(1) make menuconfig
(2) make xxx_defconfig
(3) 直接修改.config
注意: 如果直接修改.config,不一定会生效,因为有些配置可能存在依赖关系,make时会根据依赖关系,进行规则的检查,直接修改.config有时无效,所以不推荐直接修改。
以上可能有点抽象,下面举例说明:
写一个简单的入口函数输出hello world的驱动并编译进内核。
步骤:
(1)在drivers目录下新建hello文件夹,里面实现hello.c、Makefile、Kconfig。
hello.c:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int first_drv_init(void)
{
printk("------------------hello world !--------------------");
return 0;
}
static void first_drv_exit(void)
{
printk("------------------exit hello world !--------------------");
}
module_init(first_drv_init);
module_exit(first_drv_exit);
MODULE_LICENSE("GPL");
Makefile:
obj-$(CONFIG_HELLO) += hello.o
Kconfig:
config HELLO
tristate "Hello World for fengyuwuzu"
help
Hello for fengyuwuzu
config HELLO决定名字:CONFIG_HELLO。
Hello World for fengyuwuzu:决定了在make menuconfig时显示的名字
(2)修改上一级(Linux-3.4.2/drivers下)的Makefile、Kconfig。
Makefile:
obj-y += hello/
Kconfig:
source "drivers/hello/Kconfig"
(3)make menuconfig
(4)make uImage再烧写到开发板。
查看内核启动Log,伟大的helloworld 出来了!说明hello.c成功编进内核
浅谈内核的Makefile、Kconfig和.config文件的更多相关文章
- 浅谈VC++中预编译的头文件放那里的问题分析
用C++写程序,肯定要用预编译头文件,就是那个stdafx.h.不过我一直以为只要在.cpp文件中包含stdafx.h 就使用了预编译头文件,其实不对.在VC++中,预编译头文件是指放到stdafx. ...
- Linux内核中Makefile、Kconfig和.config的关系(转)
我们在编译Linux内核时,往往在Linux内核的顶层目录会执行一些命令,这里我以RK3288举例,比如:make firefly-rk3288-linux_defconfig.make menuco ...
- kernel Makefile Kconfig说明
实际文档位置:Documentation/kbuild/makefiles.txt,此为翻译稿. *************************************************** ...
- 内核顶层Makefile相关4
http://www.groad.net/bbs/simple/?f104.html make 的递归执行与 MAKEFLAGS 变量 make 的递归调用是指:在 Makefile 中使用 make ...
- Linux 内核的 Makefile
Linux内核的配置系统的基本结构 Linux内核的配置系统由三个部分组成,分别是: 1.Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则: 2.配 ...
- Linux内核配置.config文件
在命令行中,进入顶层内核目录,并输入命令make menuconfig,就可以启动一个基于菜单的内核配置编辑器.从这里开始,你可以访问每个可用的配置参数,并生成一个定制的内核配置. 当你退出配置编辑器 ...
- linux源码“.config”文件分析
一..config文件概述 .config文件是linux内核配置文件,当执行#make uImage编译生成内核时,顶层的Makefile会读取.config文件的内容,根据这个配置文件来编译所定制 ...
- Linux内核中的Kconfig、xx.defconfig、xx.config、Makefile
什么是Kconfig.xx.defconfig.xx.config.Makefile Kconfig: 一个文本形式的文件,其中主要作用是在内核配置时候,作为配置选项. xx.deconfig: Li ...
- 【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World【转】
本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/73772109 为了弄清内核的组织结构,我们先来实现下面这个简单的例子. 一.增加 ...
随机推荐
- JAVA_HOME not recognized by tomcat7 in Ubuntu
vi .bashrc 添加: export JAVA_HOME=/usr/lib/jvm/java--oracle export JRE_HOME=$JAVA_HOME/jre export CLAS ...
- linux basename命令的使用
用途 返回一个字符串参数的基本文件名称. 语法 basename String [ Suffix ] 描述 basename 命令读取 String 参数,删除以 /(斜杠) 结尾的前缀以及任何指定的 ...
- rabbitmq 不发送ack消息如何处理:rabbitmq可靠发送的自动重试机制
转载地址:http://www.jianshu.com/p/6579e48d18ae http://www.jianshu.com/p/4112d78a8753 接这篇 在上文中,主要实现了可靠模式的 ...
- zTree使用随笔
最近开发过程中,需要写一个公司人员组织架构的树状图,后来选用了依赖jQuery的zTree插件来实现,主要是该插件功能齐全,性能稳定,个性化编辑方便,遂选用了这个插件.我记录了一下根据自身需求定制化修 ...
- Word通配符
通配符模式下: ^13表示回车,^32表示空格 第一步,使用通配符替换掉无关文本 M?G-C??[A-Z]{1,20}_[A-Z]{1,20}_201?????_?? VirtualTrial[0-9 ...
- 告别CMD.windows终端神器conemu设置
前言 一种刘姥姥进大观园的感觉,现在是见啥啥新鲜.因为之前不怎么接触到命令操作,平时偶尔用用cmd也没觉得什么不妥.直到现在经常调试脚本,使用git越发感觉不方便.看见同事使用的terminal绚丽夺 ...
- GoAccess安装和使用介绍
使用文档参考地址:https://my.oschina.net/mrco/blog/181737https://www.fanhaobai.com/2017/06/go-access.html goa ...
- 洛谷 P2038 无线网络发射器选址
题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...
- 为什么我的C4C Service Request没办法Release到ERP?
问题 UI上发现找不到Release to ERP的按钮: 但是在UI Designer里是能看到这个按钮的.检查其Visible的属性,绑到了一个Calculated Rule上面: 发现其显示在r ...
- iOS消息体系架构详解-融云即时通讯云
iOS SDK 体系架构 本文档将详细介绍融云的 SDK 产品架构和消息体系,以便于您更深入的了解融云并更快速的开发自己的产品. 融云 SDK 系统架构 IMKit IMKit 的功能主要是封装各种界 ...