拿到内核的第二件事是确定哪些目录和文件需要编译,可以通过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相关推荐

  1. 一文搞懂Linux系统内核升级及下载当前内核源代码

    1. 下载当前内核源代码 为什么下载内核源代? 一是便于查看或学习linux内核代码的底层实现方法: 二是便于编写或调试Linux设备驱动程序,因为驱动程序的编译需要内核源代码. 怎么下载? 如果你是 ...

  2. 15个示例让你搞懂Linux中的cd命令

    15个示例让你搞懂Linux中的cd命令 在Linux中,cd(更改目录)命令是新手和系统管理员最重要且使用最广泛的命令之一.对于没有头绪的管理员来说,cd是导航到其他目录以检查日志,执行程序/应用程 ...

  3. linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)

    linux内核开发入门二(内核KO模块介绍.开发流程以及注意事项) 一.什么是内核模块 内核模块:ko模块(Kernel Object Module)是Linux内核中的可加载模块,它可以动态地向内核 ...

  4. 搞懂Linux零拷贝,DMA

    目录 为什么要有 DMA 技术? 传统的文件传输有多糟糕? 如何优化文件传输的性能? 如何实现零拷贝? PageCache 有什么作用? 大文件传输用什么方式实现? 总结 磁盘可以说是计算机系统最慢的 ...

  5. Linux内核入门-如何获取Linux内核源代码、生成配置内核

    如何获取Linux内核源代码 如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补丁,它们都是tar归档压缩包.除 ...

  6. 四天搞懂生成对抗网络(二)——风格迁移的“精神始祖”Conditional GAN

    点击左上方蓝字关注我们 [飞桨开发者说]吕坤,唐山广播电视台,算法工程师,喜欢研究GAN等深度学习技术在媒体.教育上的应用. 从"自由挥洒"到"有的放矢" 1. ...

  7. 【飞桨PaddlePaddle】四天搞懂生成对抗网络(二)——风格迁移的“精神始祖”Conditional GAN

    从"自由挥洒"到"有的放矢" 1.给GAN加个"按钮" 上一篇<四天搞懂生成对抗网络(一)--通俗理解经典GAN>中,我们实现了 ...

  8. Exynos4412 内核移植(二)—— 内核编译过程分析

    内核的编译同样是从Makefile 来分析: 一.内核源码结构 Linux内核文件数目近2万,出去其他架构CPU的相关文件,他们分别位于顶层目录下的17个子目录,各个目录功能独立,下面是常用目录: a ...

  9. 怎样搞懂Linux内核内存管理中的KASAN实现原理

    前言 KASAN是一个动态检测内存错误的工具.KASAN可以检测全局变量.栈.堆分配的内存发生越界访问等问题.功能比SLUB DEBUG齐全并且支持实时检测.越界访问的严重性和危害性通过我之前的文章( ...

最新文章

  1. 实例详解 DB2 排序监控和调优
  2. 初步学习pg_control文件之三
  3. python循环生成二维数组_嵌套循环二维数组的计算与构造 - python
  4. ALEIDoc EDI(7)--IDoc Extension
  5. springboot通过Intellij指定端口
  6. WebRTC基本介绍
  7. 方差,协方差 、统计学的基本概念
  8. 清华毕业生应聘“保姆”,年薪40万:她凭什么拿高薪?
  9. sublime3使用笔记
  10. java.util.concurrent.atomic原子操作类包
  11. 深入了解C++变量类型有哪些
  12. 非参数检验统计量分析
  13. VS2010/MFC编程入门系列教程
  14. 应届生比老员工更吃香?为什么大厂都在抢应届生
  15. [集训队作业2018]uoj 449 喂鸽子 - min-max容斥 - dp - NTT
  16. 2021-2027全球与中国自动卡车装卸系统市场现状及未来发展趋势
  17. 计算机软件技术就业方向,软件技术的就业前景和就业方向
  18. 160413、生成随机校验码
  19. 2019考研上海交通大学823计算机通信网真题回忆
  20. 2021-2027全球与中国GPU服务器市场现状及未来发展趋势

热门文章

  1. 三同轴连接器_三同轴连接器和线缆的定义与用途
  2. 转载:数据库的相关书籍
  3. 学习笔记:马尔可夫模型
  4. 重装系统后,如何找回Chrome中的原有书签?
  5. 数字藏品是什么:数藏app开发
  6. Qt5.8《网络版够级游戏》编写日志之二:界面设计
  7. C语言小游戏(一)——盲打小游戏(低配版)
  8. 你没见过的全新版本!大佬花了半年3面字节跳动成功上岸,附上大佬的面经分享!
  9. 如何开启惠普笔记本的VT虚机化技术?
  10. gta5虚拟服务器,画质炸裂的《GTA5》重制版,虚拟现实的混合体,堪比续作!