【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World【转】
本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/73772109
为了弄清内核的组织结构,我们先来实现下面这个简单的例子。
一、增加内核启动Hello World
任务:
内核启动的时候加载Hello驱动,并打印出Hello World
步骤:
(1)在drivers目录下新建hello文件夹,在里面实现相应的hello.c、Makefile、Kconfig
(2)修改上一级(Linux-3.4.2/drivers下)的Makefile、Kconfig
(3)make menuconfig 进行配置
(4)编译、烧写、运行
实现:
(1)实现驱动程序hello.c
最简单的驱动程序
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/delay.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");
(2)实现hello/Makefile
- # LED Core
- obj-$(CONFIG_HELLO) += hello.o
注意这里的CONFIG_HELLO,是在.config中定义的,如果配置编译进内核,则在.config中出现CONFIG_HELLO=y,那么hello.o就会被编译进内核。
(3)实现hello/Kconfig
- config HELLO
- tristate "Hello World for fengyuwuzu"
- help
- Hello for fengyuwuzu
config HELLO决定了CONFIG_HELLO这个名字
Hello World for fengyuwuzu:决定了在make menuconfig时的GUI名字
(4)修改drivers/Makefile,增加:
- obj-y += myled/
(5)修改drivers/Kconfig,增加:
- source "drivers/myled/Kconfig"
(6)make menuconfig配置相应项进内核
(7)make uImage
(8)烧写新内核启动
看到"------------------hello world !--------------------"被打印,及相应的驱动被加载。
二、linux内核中Makefile、Kconfig、.config的关系
(1)三者的作用
简单来说就是去饭店点菜:Kconfig是菜单,Makefile是做法,.config就是你点的菜
Makefile:一个文本形式的文件,编译源文件的方法。
Kconfig:一个文本形式的文件,内核的配置菜单。
.config:编译所依据的配置。
(2)三者的语法
1、Makefile
目标定义:目标定义就是用来定义哪些内容要做为模块编译,哪些要编译链接进内核。
直接编译:
obj-y += hello.o
表示要由hello.c或者hello.s文件编译得到hello.o并链接进内核
而更常见的做法是根据.config文件的CONFIG_ 变量来决定文件的编译方式 :
条件编译:
obj-$(CONFIG_HELLO) += hello.o
obj-m则表示该文件要作为模块编译。
除了y,m以外的obj-x形式的目标都不会被编译。
2、Kconfig
类型定义:
每个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的配置. hex十六进制类型显示为( )。
目录层次迭代
在Kconfig中有类似语句:source"drivers/usb/Kconfig"
用来包含(或嵌套)新的Kconfig文件,这样便可以使各个目录管理各自的配置内容,使不必把那些配置都写在同一个文件里,方便修改和管理。
配置选项之间的依赖关系:
depend on:某选项依赖于另外一个选项生成
select :反向依赖关系,该选项选中时,同时选中select后面定义的那一项
requie
默认值: default(默认y/n/m等值)
输入提示:prompt
帮助信息:help
3、.config
内核编译参考文件。
修改方式:
(1) make menuconfig
(2) make xxx_defconfig
(3) 直接修改
!注意如果直接修改,不一定会生效,因为一些配置可能存在依赖关系,make的时候会根据依赖关系,进行规则的检查,不推荐直接在.config进行修改。
【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World【转】的更多相关文章
- Linux内核中Makefile、Kconfig和.config的关系(转)
我们在编译Linux内核时,往往在Linux内核的顶层目录会执行一些命令,这里我以RK3288举例,比如:make firefly-rk3288-linux_defconfig.make menuco ...
- Linux内核中的Kconfig、xx.defconfig、xx.config、Makefile
什么是Kconfig.xx.defconfig.xx.config.Makefile Kconfig: 一个文本形式的文件,其中主要作用是在内核配置时候,作为配置选项. xx.deconfig: Li ...
- 24小时学通Linux内核总结篇(kconfig和Makefile & 讲不出再见)
非常开心能够和大家一起分享这些,让我受益匪浅,感激之情也溢于言表,,code monkey的话少,没办法煽情了,,,,,,,冬天的风,吹得伤怀,倒叙往事,褪成空白~学校的人越来越少了,就像那年我们小年 ...
- 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展
1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...
- 向linux内核中添加外部中断驱动模块
本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内 ...
- 35、在编译Linux内核中增加程序需要完成以下3项工作
在编译Linux内核中增加程序需要完成以下3项工作: 将编写的源代码拷入Linux内核源代码的相应目录. 在目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项 在目录的Makefile文 ...
- Linux内核中的GPIO系统之(3):pin controller driver代码分析
一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...
- Linux 内核的 Makefile
Linux内核的配置系统的基本结构 Linux内核的配置系统由三个部分组成,分别是: 1.Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则: 2.配 ...
- Linux内核中的GPIO系统之(3):pin controller driver代码分析--devm_kzalloc使用【转】
转自:http://www.wowotech.net/linux_kenrel/pin-controller-driver.html 一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道 ...
随机推荐
- java基础学习之垃圾回收机制
回收过程: 1.发现无用的对象 2.回收无用对象占用的内存的空间. 垃圾回收相关算法: 1.引用计数法 堆中每个对象都有一个引用计数.被引用一次,计数加一.被引用变量值变为null,则计数减一. 到计 ...
- Linux系统安装,组成及开关机
Linux系统安装,组成及开关机 系统安装 swap分区用于实现虚拟内存,文件系统类型是swap. /分区用于存放包括系统程序和用户数据在内的所有数据,文件系统类型是ext4. 系统组成 Linux内 ...
- Linux系统重要的子目录
更多目录知识 http://blog.51cto.com/yangrong/1288072 /etc/fstab 机自动挂载分区/磁盘,规定哪个分区/设备,挂载到哪里 [root@oldboy ~] ...
- python3.3+selenium
1.查看C:\Python33\Scripts下已经有了easy_install.exe; 2.从这里下载pip tar.gz,并解压到C盘,https://pypi.python.org/pypi/ ...
- 创建sum求多元素的和
a = [1, 2, 3] b = [4, 5, 6] def sum_super(* args): s = 0 for i in args: s += sum(i) return s # print ...
- 调试pcb板子的步骤
在从外边焊回来的板子中查找问题的时候,如果只是简单的 一通乱调,很有可能一下子就调好了,但是大多数的时候是调了半天,不知道接下来该如何进行,因此,严格的按照步骤走,是个不错的想法: 1.拿到板子的第一 ...
- 百练2755:神奇的口袋(简单dp)
描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中选择一些 ...
- 【Codeforces 140C】New Year Snowmen
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 每次都选择剩余个数最多的3个不同数字组成一组. 优先消耗剩余个数多的数字 这样能尽量让剩余的数字总数比较多,从而更加可能得到更多的3个组合 [ ...
- empty array & Array.from
empty array bug const duplicationArray = (arr = [], times = 2, debug = false) => { let result = [ ...
- [luoguP2949] [USACO09OPEN]工作调度Work Scheduling(贪心 + 优先队列)
传送门 这个题类似于建筑抢修. 先按照时间排序. 如果当前时间小于任务截止时间就选, 否则,看看当前任务价值是否比已选的任务的最小价值大, 如果是,就替换. 可以用优先队列. ——代码 #includ ...