拿到内核的第二件事是确定哪些目录和文件需要编译,可以通过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. Windows下 maven3.0.4的安装步骤+maven配置本地仓库(转载)
  2. 学python有必要买书吗-要不要学python
  3. mybaits四-3:获取保存数据的id
  4. 电脑科学性计算机怎么用,怎么使用科学计算器59 000×(1+r)-2
  5. android中showSoftInput不起作用 与 toggleSoftInput
  6. thinkphp json_原创干货 | Thinkphp序列化合总
  7. as3中的 override
  8. 他:32岁,公司骨干技术,月薪1万,加班猝死
  9. 马士兵Python基础版2020教程P98-P134 PPT笔记+课堂代码
  10. 分数阶微积分学薛定宇电子版_分数阶微积分 pdf epub mobi txt 下载
  11. 前端开发笔记:记一次网站创建的过程
  12. mysql 改列定义_如何更改MySQL列定义?
  13. 那些漂亮有创意的思维导图真的更吸引人吗?
  14. 逃跑吧少年维护服务器,逃跑吧少年11月19日PC端更新公告
  15. 163企业邮箱申请,163企业邮箱注册方法
  16. python怎么写excel数据透视自动报表_使用Python生成自动报表(E
  17. matlab里面axis auto,Matlab中axis函数用法总结-Go语言中文社区
  18. 劫持Linux idle进程做点自己的计算任务
  19. 1997-2020年各省三废排放量和熵值法计算的环境规制综合指数(无缺失值)
  20. 供应链管理的核心是什么?

热门文章

  1. uni-app仿今日头条滚动tab导航
  2. 情人眼里出西施,我用Python帮你搞定了!
  3. dbeaver连接Oracle缺少orai18n.jar,xdb6.jar的解决方法
  4. 10月21号微软Azure培训的PPT下载
  5. Typora常用快捷键(自收藏用)
  6. Golang 从菜鸟到大咖的必经之路_GO 语言的转义字符、注释、规范和代码风格要求
  7. 简单且灵敏的氨基酸检测试剂盒简介
  8. VS2005在Win7上兼容性问题解决
  9. Vue中引入并使用动态图标
  10. # vim与系统剪切板交互