【嵌入式Linux】源码菜单配置 | 编译 | 菜单配置的实现 | 源码编译的实现

news2024/10/7 18:52:58

源码配置编译

源码配置编译,要把中间各个环节都理清楚

厂商把自己增加的东西专门放了个文件独立,方便开发者发现变化

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的全新的配置

image-20220911224510091

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后能生成图形界面

image-20220912134924752

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 SRCARCH
    string
    option 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 Y
      here, the kernel will include drivers and infrastructure code   
      to support PCI bus devices.   
source "drivers/pci/Kconfig"

endmenu

menu "Kernel Features"
menu "Boot options"
config CMDLINE
    string "Default kernel command string"
    default ""
    help
      Provide a set of default command-line options at build time by
      entering them here. As a minimum, you should specify the the
      root device (e.g. root=/dev/nfs).
      
source "net/Kconfig"

source "drivers/Kconfig" //gf跳转   //3.3驱动配置

source "drivers/firmware/Kconfig"
      	
}

{//init/Kconfig

menu "General setup"  //常规的内核选项安装

config CROSS_COMPILE
    string "Cross-compiler tool prefix"  //设置交叉编译工具链前缀
    help
      Same as running make CROSS_COMPILE=prefix-' but stored for
      default make runs in this kernel build directory.  You don't
      need to set this unless you want the configured kernel build
      directory to select the cross-compiler automatically.

config BLK_DEV_INITRD      //是否支持ramdisk 做引导roots
    bool "Initial RAM filesystem and RAM disk (initramfs/initrd) support"


}

3.2平台选择

//arch/arm64/Kconfig.platforms	  平台选择
menu "Platform selection"	
config ARCH_TEGRA
    bool "NVIDIA Tegra SoC Family"
    select ARCH_HAS_RESET_CONTROLLER
    select CLKDEV_LOOKUP
    select CLKSRC_MMIO
    select CLKSRC_OF
    select GENERIC_CLOCKEVENTS
    select GPIOLIB
    select PINCTRL
    select GENERIC_PINCONF
    select PM
    select PM_GENERIC_DOMAINS
    select RESET_CONTROLLER
    help
      This enables support for the NVIDIA Tegra SoC family

3.3驱动配置

{//drivers/Kconfig
menu "Device Drivers"

source "drivers/base/Kconfig"
source "drivers/net/Kconfig"

}

image-20220912141132800

{//drivers/net/Kconfig
menuconfig NETDEVICES
    default y if UML
    depends on NET
    bool "Network device support"

source "drivers/net/ethernet/Kconfig"
	
}

image-20220912141219159

{//drivers/net/ethernet/Kconfig
source "drivers/net/ethernet/realtek/Kconfig"
}

image-20220912141349572

{//drivers/net/ethernet/realtek/Kconfig
config R8169   //对应Makefile里 $(CONFIG_R8169)
    tristate "Realtek 8169 gigabit ethernet support"
    depends on PCI
    select FW_LOADER
    select CRC32
    select 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 module
      will be called r8169.  This is recommended.
	
}

image-20220912141446199

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.源码编译的实现

image-20220912144604399

image-20220912144637098

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的子Makefile
 
 
PHONY := _all //入口:默认的依赖目标: make时,递归查_all依赖文件,
	      //某文件不存在或有更改(时间最新),则把依赖它的文件都重新编译。
_all: all
               
all: modules //make all时,递归查modules的依赖



%config: scripts_basic outputmakefile FORCE   //%通配符,xxconfig就从这里走
    $(Q)$(MAKE) $(build)=scripts/kconfig $@   //再脚本选择配置入口 如make menuconfig


KCONFIG_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.modpost


distclean: 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也不麻烦

image-20220912201357705

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM(HotSpot)

1、 类加载机制&#xff1a; 引导类&#xff08;Bootstrap &#xff09;加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的核心类库&#xff0c;比如 rt.jar、charsets.jar等扩展类&#xff08;Extension &#xff09;加载器&#xff1a;负责加载支撑JVM运行的位于…

真题详解(哈希表)-软件设计(八十五)

真题详解&#xff08;树的结点&#xff09;-软件设计&#xff08;八十四)https://blog.csdn.net/ke1ying/article/details/130869095 要求邮件加密方式传输&#xff0c;邮件最大附件内容可达500MB&#xff0c;发送者不可抵赖&#xff0c;若邮件被第三方截获&#xff0c;第三方…

有哪些pdf转word的免费软件?这个办法值得一试

在日常工作和学习中&#xff0c;我们经常需要将PDF文件转换为Word文档。尤其是在需要编辑PDF文档中的内容时&#xff0c;将其转换为Word文档是非常必要的。但是&#xff0c;很多人不知道该如何快速完成这项任务。在本文中&#xff0c;我们将介绍一些简单的转换方式&#xff0c;…

智能排班系统 【管理系统功能、操作说明——上篇】

文章目录 功能设计共有功能系统管理员企业管理员门店管理员门店员工 页面与功能展示用户登录企业注册系统首页系统管理员首页企业管理员首页门店管理员首页 个人中心菜单管理日志管理登录日志 功能设计 不同的角色关注的任务和功能不同&#xff0c;针对不同的角色&#xff0c;…

树莓派485转USB串口调试教程

步骤1&#xff1a;接线方式&#xff1a;485转USB 注意接线口是否对应&#xff1a;A1B1 步骤2&#xff1a;查看串口配置—映射关系是否正确 命令&#xff1a;ls -l /dev serial0即GPIO映射的串口&#xff0c;默认是ttyS0&#xff0c;即mini串口 serial1即板载蓝牙映射的串口&am…

人工智能(Pytorch)搭建模型7-改造后的新型RegNet设计空间模型的搭建与训练

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来人工智能(Pytorch)搭建模型7-新型的卷积神经网络RegNet模型的搭建与训练&#xff0c;RegNet是一种新颖的卷积神经网络架构&#xff0c;它的设计理念是通过稀疏网络结构和精细的正则化来实现高效的计算和更好的泛化能力。…

小白看了也会的Redux编程

目录 介绍 演示 异步action react-redux 多组件管理的react-redux 扩展 介绍 redux是专门用于集中式管理状态的javascript库&#xff0c;并不是react的插件库。 比如你有多个组件A-E都想要用同一个组件D中的状态&#xff1a; 1&#xff09;像以前我们可以通过父子组件通…

前几天面了个30岁左右的测试员,年薪50w问题基本都能回答上,必是刷了不少八股文···

互联网行业竞争是一年比一年严峻&#xff0c;作为测试工程师的我们唯有不停地学习&#xff0c;不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水&#xff0c;进入心仪的企业&#xff08;阿里、字节、美团、腾讯等大厂.....&#xff09; 所以&#xff0c;大家就迎来了…

TCP三次握手四次挥手(幽默版)

三次握手&#xff1a; 假设你是一只鸟&#xff0c;你要与另一只鸟进行交流。&#xff08;你是客户端&#xff09; 1.首先你会问候&#xff1a;“你好&#xff0c;我是一只鸟&#xff0c;你可以听到我说话吗&#xff1f;”&#xff08;一次会话&#xff09; 2.另一只鸟回答&am…

一文带你了解MySQL之Explain执行计划

前言&#xff1a; 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划&#xff0c;这个执行计划展示了接下来具体执行查询的方式&#xff0c;比如多表连接的顺序是什么&#xff0c;对于每个表采用什么访问方法来具体执行查询等等。MySQL…

MySQL---show profile分析SQL、trace分析优化器执行计划

1. show profile分析SQL Mysql从5.0.37版本开始增加了对 show profiles 和 show profile 语句的支持。show profiles 能够 在做SQL优化时帮助我们了解时间都耗费到哪里去了。 通过 have_profiling 参数&#xff0c;能够看到当前MySQL是否支持profile&#xff1a; select ha…

3年软件测试经验月薪7k,只会“点点点”,我该如何破局?

经常听到一些行业内的朋友说 “做测试&#xff0c;有手就行” 但事实真的是如此嘛&#xff1f; 随着测试行业的发展&#xff0c;越来越多的测试岗位对自动化测试&#xff0c;性能测试都有所要求&#xff0c;这对于很多只会功能测试的职场老人们来说&#xff0c;有了一丝丝的危…

Druid连接池技术实践

什么是Druid连接池&#xff1f; Druid连接池是阿里巴巴开源的数据库连接池项目。 Druid连接池为监控而生&#xff0c;内置强大的监控功能&#xff0c;监控特性不影响性能。功能强大&#xff0c;能防SQL注入&#xff0c;内置Loging能诊断Hack应用行为。 哦&#xff0c;首先Dru…

2023ACP世界大赛教育者论坛:让职业教育直面AI机遇与挑战

“AI技术的普及对创意行业和教育带来的影响和变革-2023 Adobe Certified Professional教育者论坛”在苏州西交利物浦大学成功举办。 本次论坛&#xff0c;由Adobe Certified Professional 世界大赛中国赛区组委会主办&#xff0c;联动了来自院校、海内外杰出的创意公司及国际知…

搭建飞书早报机器人

飞书是字节跳动推出的一款企业级通讯及协作平台&#xff0c;于2016年正式上线。它是一款基于云计算技术的软件工具&#xff0c;可以帮助企业实现快速高效的沟通和协作&#xff0c;提升工作效率&#xff0c;降低沟通成本。下面将详细介绍飞书的功能、特点以及使用体验。 功能介…

Android动画深入分析(View动画)

Android动画深入分析(View动画) Android的动画我其实在View的滑动里面写过,主要还是分为2点。 一个就是View动画&#xff0c;还有一个是属性动画 先讲述View动画 View动画 View动画主要分为4种,平移动画,缩放动画,旋转动画,透明度动画。 还有一个叫帧动画,但是表现方式和…

python+vue旅游攻略分享推荐网站p0667

基于Python语言设计并实现了旅游分享网站。该系统基于B/S即所谓浏览器/服务器模式&#xff0c;应用Django框架&#xff0c;选择MySQL作为后台数据库。系统主要包括用户、景点信息、攻略分类、旅游攻略、门票购买、留言反馈、论坛管理、系统管理等功能模块。 软件开发前的需求分…

某渣渣企业平台相关加密参数

网址 aHR0cHM6Ly93d3cucWNjLmNvbS93ZWIvZWxpYi90ZWNsaXN0P3RlYz1UX1RTTUVT抓包 GET /api/elib/getTecList?countyCode110101&flag&industry&isSortAsc&pageIndex2&pageSize20&provinceBJ&registCapiBegin&registCapiEnd&searchKey&…

修改git已经push到远端的最近一次提交的commit

需求&#xff1a; 最新一次提交的message写错了且已经push到远程仓库&#xff0c;但是又不想重新创建一个commit记录。 注意&#xff1a; 如果是多人协同开发&#xff0c;使用强推前一定确保当前版本最新&#xff0c;期间无人提交代码。 使用git Bash进入命令行窗口 git co…

基于langChain 的privateGPT 文档问答 研究

参考&#xff1a;gihtub代码 https://github.com/imartinez/privateGPT 官网 privateGPT可以在断网的情况下&#xff0c;借助GPT和文档进行交互&#xff0c;有利于保护数据隐私。 privateGPT可以有四个用处&#xff1a; 1.增强知识管理&#xff1a;私有LLMs自动化&#xff0c…