搞懂Linux内核地图之二:配置内核Makefile、Kconfig
拿到内核的第二件事是确定哪些目录和文件需要编译,可以通过Makefile来解决
以arm为例
一、Makefile 分类和关系
1、子目录Makefile:
obj-y:编译进内核
obj-m:以模块形式编译
obj-:不编译进去
各个子目录Makefile形式基本相同,没有目标,目标在主目录Makefile中
2、主目录 Makefile
根目录 Makefile通用但又依赖/arch下各体系架构的Makefile,通过include把需要的体系架构Makefile包含进来
二、内核配置思路和方法
第一步,配置需要编译的体系架构和交叉编译工具
因为主Makefile(根目录Makefile)中
include $(srctree)/arch/$(SRCARCH)/Makefile
SRCARCH :=$(ARCH)
ARCH ?=$(SUBARCH) //SUBARCH指当前的体系架构
所以默认都是编译x86架构的,需要令ARCH=arm指定体系架构
因为是在x86架构中编译运行在arm上,所以需要通过CROSS_COMPILE=xxx 指定交叉编译工具
第二步,根据SOC决定哪些文件需要编译
因为主Makefile里面有很多obj-$(CONFIG__XXX) +=YYY
所以可以通过设置CONFIG__XXX为y、m或者空来决定哪些文件需要编译
所以可以通过一个配置单,让主Makefile读这个配置单然后作用于各个子Makefile决定哪些文件需要编译,那这个配置单在哪里?肯定不可能和平台无关,在/arch/arm/configs中有很多默认配置单defconfig,根据你的SOC选取defconfig,需要想办法导出到根目录下让内核用到,通过cp /arch/arm/configs/xxx_defconfig .config,或者自己新增一个配置文件命名为.config但是不推荐
因为默认的defconfig不能满足实际的需求,所以有了第三步
第三步,修改defconfig即.config,变成适应于自己的板子
1、通过vi .config 直接修改但是工作量大
2、可以通过make menuconfig图形界面来改
make menuconfig里面的选项值会影响到.config里面宏的值,然后主Makefile读取配置单.config来进行编译
那么make menuconfig 里面有很多字符串选项,怎么把这些字符串和.config联系起来,这就需要通过Kconfig
也就是
Kconfig---->;make menuconfig--->.config--->Makefile
三、Kconfig语法和使用
可参考内核//Documentation/kbuild/Kconfig/kconfig.txt
1、source属性:包含作用,相当于Makefile中的include,如下图主Kconfig(根目录下那个)
2、menu、endmenu 属性,通过这两个来在Kconfig中自定义菜单
make menuconfig效果:
3、config属性
make menuconfig效果:
源码目录中.config效果:
5、bool、tristate属性
bool:make menuconfig前面的方括号,有编进内核、不编进内核两种选择,如下图:
tristate:make menuconfig前面的尖括号,有编进内核、不编进内核、编成模块三种选择,如下图:
6、depend on属性
配置成功了才在make menuconfig里面显示出来
四、怎么由menuconfig找Kconfig,再由Kconfig找Makefile中的.c文件
1、menuconfig找Kconfig
第一步,按H找到对应的宏
第二步,找到宏为CONFIG_SERIAL_SAMSUNG,说明应该有个属性配置config SERIAL_SAMSUNG
总结:选中menuconfig的某个选项按H,可以看到对应的宏和Kconfig位置说明,所以可以根据这个位置说明找到对应的Kconfig,也可以通过grep -nR "xxx"来搜索找到Kconfig
2、找到Kconfig后,找Makefile中对应的.c文件
在Kconfig相同路径下的Makefile中搜索相应的宏
五、修改Makefile、Kconfig给内核添加驱动模块
以添加led驱动为例,目录结构如下
-----driver
--------char
---------myled
----myledcdev.c
1、创建Makefile。需要告诉Makefile将.c驱动文件编译成.o文件,所以先在myledcdev.c的同级目录下创建Makefile并编辑它(推荐复制一个现成的Makefile并在其基础上进行修改)
CONFIG_MYLEDTEST,如果想通过menuconfig来配置需有前缀CONFIG_
因为这个Makefile会被上级Makefile包含,所以要用+=,不然上级Makefile一旦包含这个Makefile,上级Makefile里面的内容就全没了
2、创建好Makefile后,该Makefile只是在myled目录起作用而已,需要告诉内核进入到这个目录读取这个Makefile,所以需要配置上级Makefile,也就是char目录下的Makefile
3、如果想通过menuconfig控制,则要配置Kconfig,则在myledcdev.c的同级目录下创建Kconfig
4、同理需要告诉上级的Kconfig把myled下的Kconfig包含进来,所以需要修改上级Kconfig,也就是char下Kconfig
效果:
6、编译好驱动编译成image烧到开发板后,先要确定内核是否运行驱动,可用cat /proc/devices 查看是否有驱动的设备号
7、创建设备节点
8、测试
搞懂Linux内核地图之二:配置内核Makefile、Kconfig相关推荐
- 一文搞懂Linux系统内核升级及下载当前内核源代码
1. 下载当前内核源代码 为什么下载内核源代? 一是便于查看或学习linux内核代码的底层实现方法: 二是便于编写或调试Linux设备驱动程序,因为驱动程序的编译需要内核源代码. 怎么下载? 如果你是 ...
- 15个示例让你搞懂Linux中的cd命令
15个示例让你搞懂Linux中的cd命令 在Linux中,cd(更改目录)命令是新手和系统管理员最重要且使用最广泛的命令之一.对于没有头绪的管理员来说,cd是导航到其他目录以检查日志,执行程序/应用程 ...
- linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)
linux内核开发入门二(内核KO模块介绍.开发流程以及注意事项) 一.什么是内核模块 内核模块:ko模块(Kernel Object Module)是Linux内核中的可加载模块,它可以动态地向内核 ...
- 搞懂Linux零拷贝,DMA
目录 为什么要有 DMA 技术? 传统的文件传输有多糟糕? 如何优化文件传输的性能? 如何实现零拷贝? PageCache 有什么作用? 大文件传输用什么方式实现? 总结 磁盘可以说是计算机系统最慢的 ...
- Linux内核入门-如何获取Linux内核源代码、生成配置内核
如何获取Linux内核源代码 如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补丁,它们都是tar归档压缩包.除 ...
- 四天搞懂生成对抗网络(二)——风格迁移的“精神始祖”Conditional GAN
点击左上方蓝字关注我们 [飞桨开发者说]吕坤,唐山广播电视台,算法工程师,喜欢研究GAN等深度学习技术在媒体.教育上的应用. 从"自由挥洒"到"有的放矢" 1. ...
- 【飞桨PaddlePaddle】四天搞懂生成对抗网络(二)——风格迁移的“精神始祖”Conditional GAN
从"自由挥洒"到"有的放矢" 1.给GAN加个"按钮" 上一篇<四天搞懂生成对抗网络(一)--通俗理解经典GAN>中,我们实现了 ...
- Exynos4412 内核移植(二)—— 内核编译过程分析
内核的编译同样是从Makefile 来分析: 一.内核源码结构 Linux内核文件数目近2万,出去其他架构CPU的相关文件,他们分别位于顶层目录下的17个子目录,各个目录功能独立,下面是常用目录: a ...
- 怎样搞懂Linux内核内存管理中的KASAN实现原理
前言 KASAN是一个动态检测内存错误的工具.KASAN可以检测全局变量.栈.堆分配的内存发生越界访问等问题.功能比SLUB DEBUG齐全并且支持实时检测.越界访问的严重性和危害性通过我之前的文章( ...
最新文章
- Windows下 maven3.0.4的安装步骤+maven配置本地仓库(转载)
- 学python有必要买书吗-要不要学python
- mybaits四-3:获取保存数据的id
- 电脑科学性计算机怎么用,怎么使用科学计算器59 000×(1+r)-2
- android中showSoftInput不起作用 与 toggleSoftInput
- thinkphp json_原创干货 | Thinkphp序列化合总
- as3中的 override
- 他:32岁,公司骨干技术,月薪1万,加班猝死
- 马士兵Python基础版2020教程P98-P134 PPT笔记+课堂代码
- 分数阶微积分学薛定宇电子版_分数阶微积分 pdf epub mobi txt 下载
- 前端开发笔记:记一次网站创建的过程
- mysql 改列定义_如何更改MySQL列定义?
- 那些漂亮有创意的思维导图真的更吸引人吗?
- 逃跑吧少年维护服务器,逃跑吧少年11月19日PC端更新公告
- 163企业邮箱申请,163企业邮箱注册方法
- python怎么写excel数据透视自动报表_使用Python生成自动报表(E
- matlab里面axis auto,Matlab中axis函数用法总结-Go语言中文社区
- 劫持Linux idle进程做点自己的计算任务
- 1997-2020年各省三废排放量和熵值法计算的环境规制综合指数(无缺失值)
- 供应链管理的核心是什么?