【嵌入式Linux】源码菜单配置 | 编译 | 菜单配置的实现 | 源码编译的实现
源码配置编译
源码配置编译,要把中间各个环节都理清楚
厂商把自己增加的东西专门放了个文件独立,方便开发者发现变化
1.菜单配置
移植的第一步,就是选配,通过make menuconfig图形化界面选配
//载入配置
$ make ARCH=arm64 tegra_defconfig //导入官方配置//会从arch/arm64/configs下 查找tegra_defconfig,导入到当前目录,重命名为.config)
$ make menuconfig //在官方配置基础上进行配置//从零配置
$ mv .config .config.ago //如有,则改名 -> 清除当前配置(.config)
$ make menuconfig ARCH=arm64 /*生成最初始配置界面(如不指定ARCH,默认的是x86的)当前目录有.config则导入,如无则用默认x86配置生成.config*///保存配置
$ make savedefconfig //生成defconfig (相比make menuconfig 里的Save保存的配置,这是最简的)
$ cp defconfig arch/arm64/configs/my_defconfig //发布配置(原厂发布配置到内核就是该方式)
1.1载入配置
//载入配置
$ make ARCH=arm64 tegra_defconfig //导入官方配置//会从arch/arm64/configs下 查找tegra_defconfig,导入到当前目录,重命名为.config)
$ make menuconfig //在官方配置基础上进行配置
1.2从零配置
//从零配置
$ mv .config .config.ago //如有,则改名 -> 清除当前配置(.config)
$ make menuconfig ARCH=arm64 /*生成最初始配置界面(如不指定ARCH,默认的是x86的)当前目录有.config则导入,如无则用默认x86配置生成.config*/
ARM64的全新的配置
General setup->Cross-compiler tool prefix 交叉编译工具(可以这里指定,也可以Makefile中改)
Enable loadable module support 模块的支持ko文件
Enable the block layer 块设备支持
Platform selection 平台选择,虽然架构一样,但是不同厂商的芯片也各不同
Bus support 总线支持,例如PCIe等
Kernel Features 内核特性
Boot options 启动选项,可以默认bootargs
Power management options 电源管理
Networking support 网络
Device Drivers 驱动
1.3保存配置
//第一种,make menuconfig生成的.config放到对应目录,比较多无关信息
cd ~/kernel-4.9
cp .config arch/arm64/configs/yhai_defconfig
//第二种保存配置
$ make savedefconfig //生成defconfig (相比make menuconfig 里的Save保存的配置,这是最简的)
$ cp defconfig arch/arm64/configs/yhai_defconfig //发布配置(原厂发布配置到内核就是该方式)
2.编译
$ make /*编译所有常需指定 交叉编译工具链 CROSS_COMPILE(如无默认采用 gcc)
方式一: make CROSS_COMPILE=aarch64-linux-gnu- 直接指定
方式二: export CROSS_COMPILE=aarch64-linux-gnu- 导出环境变量*/
$ make all
$ make Image //只编译内核
$ make modules //只编译模块
$ make dtbs //只编译设备树$ make install /*安装内核 就是把编译出来的二进制文件,库,配置文件等等放到相应目录下常需指定 安装路径 INSTALL_PATH
方式一: make install INSTALL_PATH=/tftpboot 直接指定
方式二: export INSTALL_PATH=/tftpboot 导出环境变量*/
$ make modules_install /*安装模块常需指定 安装路径 INSTALL_MOD_PATH
方式一:make modules_install INSTALL_MOD_PATH=~/Linux_for_Tegra/rootfs 直接指定
方式二:export INSTALL_MOD_PATH=~/Linux_for_Tegra/rootfs 导出环境变量*/
3.菜单配置的实现
为什么make menuconfig后能生成图形界面
3.1顶层配置
Kconfig 总菜单
source “arch/$SRCARCH/Kconfig” 子菜单
menu “Bus support” 显示的字
menuconfig 可以选的菜单
config 可以选的参数
default 默认选择 显示-*-
bool 只有YN 显示[*]
tristate 三态YNM 显示<>
{//Kconfig
//对应菜单信息 .config - Linux/arm64 4.9.253 Kernel Configuration
mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"config SRCARCHstringoption env="SRCARCH"source "arch/$SRCARCH/Kconfig" //导入子Kconfig}{//arch/arm64/Kconfig
source "init/Kconfig" //gf 跳转到子配置【这个对应General setup --->】source "kernel/Kconfig.freezer" source "arch/arm64/Kconfig.platforms" //3.2平台选择 menu "Bus support" config PCI bool "PCI support"help This feature enables support for PCI bus system. If you say Yhere, the kernel will include drivers and infrastructure code to support PCI bus devices.
source "drivers/pci/Kconfig"endmenumenu "Kernel Features"
menu "Boot options"
config CMDLINEstring "Default kernel command string"default ""helpProvide a set of default command-line options at build time byentering them here. As a minimum, you should specify the theroot device (e.g. root=/dev/nfs).source "net/Kconfig"source "drivers/Kconfig" //gf跳转 //3.3驱动配置source "drivers/firmware/Kconfig"}{//init/Kconfigmenu "General setup" //常规的内核选项安装config CROSS_COMPILEstring "Cross-compiler tool prefix" //设置交叉编译工具链前缀helpSame as running make CROSS_COMPILE=prefix-' but stored fordefault make runs in this kernel build directory. You don'tneed to set this unless you want the configured kernel builddirectory to select the cross-compiler automatically.config BLK_DEV_INITRD //是否支持ramdisk 做引导rootsbool "Initial RAM filesystem and RAM disk (initramfs/initrd) support"}
3.2平台选择
//arch/arm64/Kconfig.platforms 平台选择
menu "Platform selection"
config ARCH_TEGRAbool "NVIDIA Tegra SoC Family"select ARCH_HAS_RESET_CONTROLLERselect CLKDEV_LOOKUPselect CLKSRC_MMIOselect CLKSRC_OFselect GENERIC_CLOCKEVENTSselect GPIOLIBselect PINCTRLselect GENERIC_PINCONFselect PMselect PM_GENERIC_DOMAINSselect RESET_CONTROLLERhelpThis enables support for the NVIDIA Tegra SoC family
3.3驱动配置
{//drivers/Kconfig
menu "Device Drivers"source "drivers/base/Kconfig"
source "drivers/net/Kconfig"}
{//drivers/net/Kconfig
menuconfig NETDEVICESdefault y if UMLdepends on NETbool "Network device support"source "drivers/net/ethernet/Kconfig"}
{//drivers/net/ethernet/Kconfig
source "drivers/net/ethernet/realtek/Kconfig"
}
{//drivers/net/ethernet/realtek/Kconfig
config R8169 //对应Makefile里 $(CONFIG_R8169)tristate "Realtek 8169 gigabit ethernet support"depends on PCIselect FW_LOADERselect CRC32select MII---help---Say Y here if you have a Realtek 8169 PCI Gigabit Ethernet adapter.To compile this driver as a module, choose M here: the modulewill be called r8169. This is recommended.}
3.4当前的配置文件
//Makefile在编译时通过读取.config文件的配置来选择要编译的文件
CONFIG_ARM64=y
CONFIG_MMU=y
CONFIG_CROSS_COMPILE=""
CONFIG_ROOT_NFS=y
CONFIG_R8169=y
CONFIG_VIDEO_IMX219=y
3.5配置头文件
//include/generated/autoconf.h 配置头文件(编译后自动生成的 )
//通过该文件,可知当前生效的配置是那些
#define CONFIG_R8169 1 //有线网卡
#define CONFIG_VIDEO_IMX219 1 //排线摄像头
4.源码编译的实现
make的时候根据时间最新原则以及该最新变过的依赖重新编译生成.o文件,再连接到一起
make clean会把.o文件给删掉,下次再make就会很废时间
Kconfig和Makefile都是成对出现的,从最顶层逐渐往下面的子文件走
4.1顶层管理
//Makefile : 顶层 Makefile,负责总体内核的编译链接ARCH ?= $(SUBARCH) //指定arch(如传参 make ARCH=arm64),如不指定默认x86//为避免重复输入,强制写死 如ARCH ?= arm64
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%) //指定交叉编译工具链//(如传参 make CROSS_COMPILE=aarch64-linux-gnu-)//强制写死CROSS_COMPILE ?= aarch64-linux-gnu-LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc//指定源码子目录
drivers-y := drivers/ sound/ firmware/
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ srctree := . //指定源码树顶层目录
objtree := . //指定目标文件树顶层目录include arch/$(SRCARCH)/Makefile //指定导入 arch的子MakefilePHONY := _all //入口:默认的依赖目标: make时,递归查_all依赖文件,//某文件不存在或有更改(时间最新),则把依赖它的文件都重新编译。
_all: allall: modules //make all时,递归查modules的依赖%config: scripts_basic outputmakefile FORCE //%通配符,xxconfig就从这里走$(Q)$(MAKE) $(build)=scripts/kconfig $@ //再脚本选择配置入口 如make menuconfigKCONFIG_CONFIG ?= .config //读入当前配置文件modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpostdistclean: mrproper //慎用,它会把你前面的配置,全部清除掉@find $(srctree) $(RCS_FIND_IGNORE) \-o -name '.*.rej' -o -name '*%' help:@echo 'Cleaning targets:'@echo '$(CROSS_COMPILE)' //查看变量CROSS_COMPILE的内容, @表示不显示eho本身
4.2通用规则、脚本
//scripts/kconfig/Makefile
menuconfig: $(obj)/mconf$< $(silent) $(Kconfig) //导入Kconfig ,生成图形界面
4.3体系结构的管理
{//arch/arm64/Makefile: 编译体系结构的子Makefile
//负责本体系结构的相关代码编译 生成内核镜像//指定源码子目录
core-y += arch/arm64/kernel/ arch/arm64/mm/
core-$(CONFIG_NET) += arch/arm64/net/ //$(CONFIG_NET)是当配置后,会变为y,或m -> 实现界面配置 那些源码编译或不编译KBUILD_IMAGE := Image.gz
KBUILD_DTBS := dtbs all: $(KBUILD_IMAGE) $(KBUILD_DTBS) //入口boot := arch/arm64/boot //指定存放Image 的目录Image: vmlinux //make Image 的入口,指定编译内核镜像$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@dtbs: //make dtbs 的入口,指定编译设备树$(Q)$(MAKE) $(build)=$(boot)/dts
}{//arch/arm64/kernel/Makefile# Object file lists. //指定编译的文件(写死的),只需指定.o ,到时会自动找到.c 或.s的文件去编译
arm64-obj-y := debug-monitors.o entry.o irq.o fpsimd.o \entry-fpsimd.o process.o
arm64-obj-$(CONFIG_PCI) += pci.o //配置时可改变 $(CONFIG_PCI)的值 -> 实现编译文件的 动态调整 obj-y += $(arm64-obj-y) //添加编进内核的文件
obj-m += $(arm64-obj-m) //添加编成模块的文件
}
4.4子文件的管理
{//init/Makefile
obj-y := main.o version.o mounts.o
obj-$(CONFIG_BLK_DEV_INITRD) += initramfs.o
}{//drivers/net/ethernet/realtek/Makefile
obj-$(CONFIG_8139CP) += 8139cp.o
obj-$(CONFIG_8139TOO) += 8139too.o
obj-$(CONFIG_ATP) += atp.o
obj-$(CONFIG_R8169) += r8169.o //变量$(CONFIG_NET) 由配置时决定 -> 动态决定编译文件}
如果要添加新的驱动,将其编译进内核,如vr_sensor.c文件,放到对应的文件夹下
直接在Makefile中添加obj-y += vr_sensor.o即可,这样最快,可以不用和Kconfig和CONFIG打交道
当然这样添加多了比较混乱
还是在这个文件夹下Kconfig中添加对应config即可,再到顶层make menuconfig也不麻烦
相关文章:

【嵌入式Linux】源码菜单配置 | 编译 | 菜单配置的实现 | 源码编译的实现
源码配置编译 源码配置编译,要把中间各个环节都理清楚 厂商把自己增加的东西专门放了个文件独立,方便开发者发现变化 1.菜单配置 移植的第一步,就是选配,通过make menuconfig图形化界面选配 //载入配置 $ make ARCHarm64 tegra_defconfi…...

python自动化爬虫实战
python自动化爬虫实战 偶然的一次机会再次用到爬虫,借此机会记录一下爬虫的学习经历,方便后续复用。 需求:爬取网站数据并存入的csv文件中,总体分为两步 爬取网站数据存到到csv文件中 1、配置爬虫环境 1.1、下载自动化测试驱动 …...

LVGL-最新版本及其版本定义标准
lvgl的最新版本是9.0.0,处于开发分支中。 稳定版本是8.3.0. 建议一般开发使用稳定版8.3.0. .\lvgl.h定义了当前版本 /*************************** CURRENT VERSION OF LVGL ***************************/ #define LVGL_VERSION_MAJOR 8 #define LVGL_VERSION_MINO…...
ORB_SLAM2算法中如何计算右目和左目两个特征点的是否匹配?
文章目录 if(kpR.octave<levelL-1 || kpR.octave>levelL+1)const int &levelL = kpL.octave;if(uR>=minU && uR<=maxU)const cv::Mat &dR = mDescriptorsRight.row(iR);const int dist = ORBmatcher::DescriptorDistance(dL,dR);筛选最佳匹配特征点…...
Android 12.0系统Settings主页去掉搜索框
1.概述 在12.0定制化开发中,在系统原生设置中主页的搜索框是要求去掉的,不需要搜索功能,所以首选看下布局文件 看下搜索框是哪个布局,然后隐藏到布局,达到实现功能的目的 2.系统Settings主页去掉搜索框的主要代码 packages/apps/Settings/src/com/android/settings/home…...
电脑数据丢失如何恢复
随着电脑使用的日益普及,数据丢失成为了很多用户不得不面对的问题。数据丢失的原因有很多,例如误删除文件、磁盘格式化、电脑病毒等等。一旦发生数据丢失的情况,我们就需要利用专业的数据恢复工具来尽快找回被丢失的数据。下面我们就来详细介…...

大数据分析案例-基于决策树算法构建世界杯比赛预测模型
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
Python 图形界面框架 PyQt5 使用指南
Python 图形界面框架 PyQt5 使用指南 使用Python开发图形界面的软件其实并不多,相对于GUI界面,可能Web方式的应用更受人欢迎。但对于像我一样对其他编程语言比如C#或WPF并不熟悉的人来说,未必不是一个好的工具。 常见GUI框架 PyQt5[1]&#…...

代码随想录算法训练营第四十二天 | 二维dp数组01背包, 力扣 416. 分割等和子集
背包 解析 1.确定dp数组以及下标的含义 对于背包问题,有一种写法, 是使用二维数组,即dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。 2.确定递推公式 有两个方向推出来dp[i][…...

【1110. 删点成林】
来源:力扣(LeetCode) 描述: 给出二叉树的根节点 root,树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的…...

第三章 JVM内存概述
附录:精选面试题 Q:为什么虚拟机必须保证一个类的Clinit( )方法在多线程的情况下被同步加锁 ? A: 因为虚拟机在加载完一个类之后直接把这个类放到本地内存的方法区(也叫原空间)中了,当其他程序再来调这个类…...

基于SpringBoot的企业客户信息反馈平台的设计与实现
背景 企业客户信息反馈平台能够通过互联网得到广泛的、全面的宣传,让尽可能多的用户了解和熟知企业客户信息反馈平台的便捷高效,不仅为客户提供了服务,而且也推广了自己,让更多的客户了解自己。对于企业客户信息反馈而言…...
【SA8295P 源码分析】01 - SA8295P 芯片介绍
【SA8295P 源码分析】01 - SA8295P 芯片介绍 一、Processors 处理器介绍二、Memory 内存介绍三、Multimedia 多媒体介绍3.1 DPU 显示处理器:Adreno DPU 11993.2 摄像头ISP:Spectra 395 ISP3.3 视频处理器:Adreno video processing unit (VPU)3.4 图像处理器:Adreno graphic…...
扩展1:Ray Core详细介绍
扩展1:Ray Core详细介绍 导航 1. 简介和背景2. Ray的基本概念和核心组件3. 分布式任务调度和依赖管理4. 对象存储和数据共享5. Actor模型和并发编程6. Ray的高级功能和扩展性7. 使用Ray构建分布式应用程序的案例研究8. Ray社区和资源9. 核心框架介绍...

day08 Spring MVC
spring MVC相当于Servlet mvc解释:模型,视图,控制器 **使用该思想的作用:**减少耦合性,提高可维护性 Spring MVC前端控制器 方式1 1.在web.xml中配置前端控制器方式2 要是用前端控制器,必须在web.xml中配置DidpatcherServlet类 <!--前端控制器--> <servlet&g…...
c++中的extern “C“
在一些c语言的library库中,我们经常可以还看下面这样的结构 #ifndef __TEST_H #define __TEST_H#ifdef _cplusplus extern "C" { #endif/*...*/#ifdef _cplusplus } #endif #endif#ifndef __TEST_H这样的宏定义应该是非常常见了,其作用是为了…...
python异常处理名称整理
Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。BaseException所有异常的基类UnboundLocalError访问未初始化的本地变量SystemExit...

SpringMVC拦截器
SpringMVC拦截器 介绍 拦截器(interceptor)的作用 SpringMVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器 进行预处理和后处理 将拦截器按一定的顺序连接成一条链,这条链称为拦截器链(Interception Ch…...
Python第八章作业(初级)
目录 第1关:统计字母数量 第2关:统计文章字符数 第3关:查询高校信息 第4关:查询高校名 第5关:通讯录读取 第6关:JSON转列表 第7关:利用数据文件统计成绩 第8关:研究生录取数据…...

chatgpt赋能python:Python中如何取消列表
Python中如何取消列表 在Python中使用列表是一种非常常见的数据结构,它允许我们在其中存储任意数量的元素,并且可以非常容易地进行遍历和操作。但是,有时候我们需要从列表中删除元素。这个过程并不难,但是有些细节需要注意。本文…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...