Kbuild学习知识点

1.Kbuild本质:一个可扩展、可配置的Makefile框架,递归式Makefile,菜单式配置。

2.Kbuild构成:

  • Makefile:顶层目录下的Makefile
  • .config:内核的配置文件
  • arch/S(ARCH)/Makefile:跟平台架构相关的Makefile
  • scripts/Makefile.*:通用编译规则
  • Kbuild Makefile:分布在各个子目录下
  • Kconfig:配置菜单,定义每个configsymbol的属性 (类型、描述、依赖等)

3.Kconfig作用:

  • 用来生成配置菜单,配置各种config symbol
  • 生成对应的配置变量:CONFIG_XXX
  • 每个目录下都有一个Kconfig文件
  • 各个Kconfig文件通过source命令构建多级菜单
  • 解析工具:scripts/kconfig/*conf

4.要想使用make menuconfig图形界面,第一次使用前要先安装图形库:apt-get install libncurses-dev。

5.Kconfig语法:

  • menu:定义了菜单名字,必须以endmenu结束,menu后跟的名字会显示在菜单中,menu和endmenu之间的config选项都是菜单子条目,mainmenu用来定义主菜单
  • config:用来定义菜单选项,选项类型可以是bool(y、n两种选择)、tristate(y、n、m三种选择)、int、hex、string。
  • comment:注释,用于在图形化界面中显示一行注释
  • if/endif:if ...enif: 就是if的意思,需要enif结束
  • source:导入其他Kconfig文件的内容到当前位置,相当于宏定义替换,生成一个树型菜单
  • help:帮助信息,内容会显示在帮助的help选项上
  • default y: 表示当前选项默认是勾上的,也可以写为default m或者default n
  • depends on:表示当前config菜单选项依赖另外一个菜单选项,只有所依赖的那个菜单选项被设置为y当前菜单选项才会在图形界面中显示出来并可供选择。depends on还可以是依赖于编译器的编译选项等(即在所依赖的编译选项开启时才可供选择)
  • select:强反向依赖,比如在A选项下面使用了select B,那么当A模块被设置成y选中时,B模块也会自动被设置成y选中并且无法再被更改
  • imply:弱反向依赖,在上述情况下B模块被选中后,还可以更改B的设置
  • menuconfig:在使用config选项中使用depends on时,如果依赖的选项被选中,当前config选项会在同一个界面显示出来,而使用menuconfig选项之后会使用层次结构显示配置选项,即会转到一个新的界面显示依赖于menuconfig选项的config选项,有以下两种等价写法:

    上图中的A0、A1必须紧跟着A,B0、B1必须紧跟着B,否则将不会按照层次结构显示新的菜单界面,而只会在当前界面显示
  • choice:将多个类似的配置选项组合在一起,供用户单选或多选,以endchoice结束,示例如下:

6.最常用的进行编译选项设置并生成配置文件的命令使make menuconfig,但是下图所示的几种命令也可以使用,还有一种最基本的是make config命令,它是最基础的配置方式,完全基于文本。

生成的配置文件.config会被保存在源码根目录下。

7.Kbuild中的一些变量:

  • build:定义在scripts/Kbuild.include里面,build := -f $(srctree)/scripts/Makefile.build obj,srctree在scripts/ Makefile中有定义,例如:srctree = $(CURDIR),$(CURDIR) 是一个内置的 Makefile 变量,用于表示当前工作目录的绝对路径。在Makefile中,obj变量通常用来指定目标对象的目录。
  • obj-m:将当前文件编译为独立的模块
  • obj-y:将当前文件编译进内核
  • xxx-objs:一个模块依赖的多个源文件,如mconf-objs表示mconf依赖的所有源文件

8.scripts/Makefile.*各类规则文件:

  • scripts/Makefile.build:通用规则,用来编译built-in.a、lib.a
  • scripts/Makefile.lib:负责分析obj-y、obj-y和子目录中的subdir-y等
  • scripts/Makefile.include:一些通用定义,被Makefile.*包含使用
  • scripts/Makefile.host:编译各种主机工具
  • scripts/Makefile.headerinst:头文件安装规则
  • scripts/Makefile.modinst:模块install规则
  • scripts/Makefile.modpost:模块编译,由.o和.mod生成module.ko
  • scripts/Makefile.modsign:模块签名
  • scripts/Makefile.clean:clean规则,make clean时调用

9.Kbuild Makefile工作流程:

  • 根据ARCH变量,首先include arch/S(ARCH)/Makefile
  • 读取.config文件:读取用户的各种配置变量
  • 解析预定义目标、目标,构建依赖关系
  • 编译各个模块或组件(使用scripts/Makefile.):将每个目录下的源文件编译为对应的.o目标文件,将.o目标文件归档为built-in.a
  • 将所有对象链接成 vmlinux
  • 编译模块…

10.vmlinux是Linux内核编译后的完整产物,以ELF格式存在,包含所有代码、数据和调试信息。它用于生成压缩的启动镜像,如zImage和bzImage,这些通常被引导加载程序使用来启动系统。vmlinux对开发者在调试和分析内核时至关重要。

11.zImage和bzImage是Linux内核的两种压缩映像文件,主要用于系统启动过程。zImage通常用于ARM架构,通过gzip压缩,适用于较小的内核,兼容性好。它被设计为位置无关码,可以在任何地址运行。bzImage意为“big zImage”,适用于x86架构,使用gzip压缩,支持更大的内核,通常解压到1MB以上的内存位置。两者都是在引导时由启动加载程序加载并解压,然后跳转到内核入口点执行。主要区别在于支持的内核大小和压缩算法,以及解压后的内存位置。

12.linux内核编译流程,uImage是可以通过u-boot启动的镜像:

vmlinux是Linux内核的可执行文件,包含了内核的所有代码和符号信息,负责管理系统资源和提供服务。通过编译Linux内核源代码生成,通常存储在内核源代码的arch/<architecture>/boot/目录下。启动时,vmlinux被引导加载程序(如GRUB)加载,并与压缩格式的内核映像(如bzImage或zImage)一起使用。它在系统调试中也非常重要,开发者可利用其符号信息进行内核调试和问题追踪。与上图对应的编译过程如下图:

第一个vmlinux是由built-in.o编译生成的原始elf文件,然后使用objcopy工具将其中的不必要的段去除,并压缩生成原始纯二进制内核镜像arch/arm/boot/Image,再利用gzip压缩工具将其再次压缩为arch/arm/compressed/piggy_data,并生成arch/arm/compressed/piggy.o。之后再将head.o、misc.o、decompress.o、piggy.o等一起链接为arch/arm/compressed/vmlinux,再次用objcopy工具将其中的不必要的段去除,并压缩生成纯二进制内核镜像arch/arm/boot/zImage。还可以根据需要利用mkimage工具将zImage进一步转换为uImage,如下图所示:

13.obj-y中的文件会被编译并链接到内核镜像(如vmlinux)中,成为内核的一部分,且在内核启动时自动加载,无法动态加载或卸载。也就是说,所有的obj-y文件被编译为.o文件后,和其他内核组件一起被链接,生成一个统一的内核镜像文件。而obj-m中的文件会被编译为独立的.ko文件(可加载内核模块),每个模块对应一个.ko文件。它们可根据需要通过insmod或modprobe命令动态加载,使用rmmod卸载,适用于内核运行时灵活扩展功能。

14.module.mod文件存储的信息是当前目标模块module所依赖的所有源文件、头文件、或者其他的模块,如:hello.mod文件只有一行内容drivers/char/hello.o表示hello模块依赖于drivers/char/hello.o,drivers/char/hello.o是由hello.c源文件编译而成的目标文件。modules.order文件是内核构建过程中的一个辅助文件,通常每个独立的内核构建目录中会有一个自己的 modules.order 文件,这个文件是在内核编译过程中由 make 命令自动生成的,用于记录在该特定目录下编译的所有内核模块及其编译顺序(如需要生成的所有.ko文件的信息)。.ko文件是Linux内核模块文件的扩展名,它表示"Kernel Object",是内核模块,Linux内核模块是可以动态加载或卸载的代码段,提供新的功能或驱动支持,而不需要重新启动系统。module.mod.c是Linux内核模块编译过程中生成的中间文件,包含模块的元信息、符号表和初始化函数引用,用于帮助生成最终的 .ko 文件(module.ko 文件是由module.o和module.mod.o链接而成的)。Module.symvers文件在Linux内核模块编译中用于记录导出符号及其CRC值(循环冗余校验),不同内核版本或配置可能生成不同的Module.symvers文件。外部模块可以共用一个Module.symvers文件,也可以有自己的版本,这取决于构建设置。

要想自己添加外部模块需要自己在顶层Makefile中添加形如obj-$(CONFIG_HELLO)+=hell.o的内容,然后在相应的Kconfig文件中添加是否开启hello模块的选项,然后就可以通过make menuconfig命令设置是否启用模块了。

15.想要安装模块时可以使用make modules_install命令,执行此命令时,kbuild系统会根据每个子目录下的modules.order 文件将相应的编译好的.ko文件拷贝到/lib/modules /$(uname -r)/kernel/目录下面(其中$(uname -r)是你的当前运行内核版本)进行安装,并在/lib/modules /$(uname -r)/目录下生成modules.dep文件,modules.dep文件是Linux内核模块依赖关系的数据库文件,它包含了系统中所有内核模块的依赖信息,记录了模块之间的依赖关系,例如哪些模块依赖于其他模块。

16.include/uapi目录包含了用户空间(userspace)程序可以使用的头文件。这些头文件定义了用户空间与内核空间之间共享的接口,包括系统调用、数据结构、常量等。这些文件是为了让用户空间程序在编译时能够访问到内核定义的接口,而无需关心内核的具体实现细节。include目录下的其他子目录,如include/linux、include/asm等,包含了内核空间(kernelspace)程序使用的头文件,这些头文件定义了内核内部使用的数据结构、宏、函数原型等,它们是内核实现其功能的基础,这些文件通常不适用于用户空间程序。在Linux内核的构建过程中,可以使用make headers_install命令来安装这些内核头文件,这个命令会将/include/uapi里面的头文件安装到/usr/include中供用户使用。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++和OpenGL实现3D游戏编程【连载19】——着色器光照初步(平行光和光照贴图)(附源码)

1、本节要实现的内容 我们在前期的教程中,讨论了在即时渲染模式下的光照内容。但在我们后期使用着色器的核心模式下,会经常在着色器中使光照,我们这里就讨论一下着色器光照效果,以及光照贴图效果,同时这里知识会为后期的更多光照效果做一些铺垫。本节我们首先讨论冯氏光照…

后端java开发路由接口并部署服务器(四)

一、安装IntelliJ IDEA&#xff0c;安装包下载 1、官网下载 2、网盘资源 安装包下载完成后进行傻瓜式下一步安装就可以了 打开IntelliJ IDEA&#xff0c;输入网盘资源文件内容 三、汉化处理 插件搜索chinese&#xff0c;就会找到相应的插件安装重启软件即可 四、新建后端j…

一文理解ssh,ssl协议以及应用

在使用基于密钥的认证方式的时候&#xff0c;私钥的位置一定要符合远程服务器规定的位置&#xff0c;否则找不到私钥的位置会导致建立ssh连接失败 SSH 全称是 “Secure Shell”&#xff0c;即安全外壳协议。 它是一种网络协议&#xff0c;用于在不安全的网络中安全地进行远程登…

通往O1开源之路

“Scaling of Search and Learning: A Roadmap to Reproduce o1 from Reinforcement Learning Perspective”由复旦大学和上海人工智能实验室的研究者撰写。该论文从强化学习视角出发&#xff0c;深入分析了实现类似OpenAI o1模型性能的路线图&#xff0c;聚焦于策略初始化、奖…

FPGA、STM32、ESP32、RP2040等5大板卡,结合AI,更突出模拟+数字+控制+算法

板卡选择困难症了&#xff1f;如果你也想玩FPGA、STM32、ESP32、RP2040相关的板卡&#xff0c;不如看看以下几款板卡&#xff0c;如果正巧碰上能实现你想要做的项目呢~ 01 小脚丫FPGA STEP BaseBoard V4.0套件 STEP BaseBoard V4.0是第4代小脚丫FPGA扩展底板&#xff08;点击了…

python进阶06:MySQL

课后大总结 Day1 一、数据库命令总结 1.连接数据库 连接数据库进入mysql安装目录打开bin文件夹&#xff0c;输入cmd(此命令后无分号)mysql.exe -u root -ppassword命令后输入密码:root 设置密码set passwordpassword("root123"); 查看所有数据库show databases; …

lec7-路由与路由器

lec7-路由与路由器 1. 路由器硬件 路由器的硬件部分&#xff1a; 断电失去&#xff1a; RAM断电不失去&#xff1a;NVRAM&#xff0c; Flash&#xff0c; ROMinterface也算是一部分 路由器是特殊组件的计算机 console 口进行具体的调试 辅助口&#xff08;Auxiliary&…

HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级

注&#xff1a;本文为 “HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级” 相关文章合辑。 引文图片 csdn 转储异常&#xff0c;重传。 篇 1&#xff1a;Smart-Baby 回复中给出故障现象判断参考 篇 2、篇3 &#xff1a;HP 官方 BIOS 恢复、升级教程 开机黑屏&#xff0c…

代码随想录算法训练营第五十天|图论基础|深度优先搜索理论基础|KM98.所有可达路径|广度优先搜索理论基础

图论基础 1、图的基本概念 二维坐标中&#xff0c;两点可以连成线&#xff0c;多个点连成的线就构成了图。 当然图也可以就一个节点&#xff0c;甚至没有节点&#xff08;空图&#xff09; 2、图的种类 整体上一般分为有向图和无向图&#xff1b; 有向图是指图中边是有方向的…

《Vue3实战教程》40:Vue3安全

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 安全​ 报告漏洞​ 当一个漏洞被上报时&#xff0c;它会立刻成为我们最关心的问题&#xff0c;会有全职的贡献者暂时搁置其他所有任务来解决这个问题。如需报告漏洞&#xff0c;请发送电子邮件至 securityvuejs.org。…

2025年1月4日蜻蜓q旗舰版st完整开源·包含前后端所有源文件·开源可商用可二开·优雅草科技·优雅草kir|优雅草星星|优雅草银满|优雅草undefined

2025年1月4日蜻蜓q旗舰版st完整开源包含前后端所有源文件开源可商用可二开优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined 产品介绍&#xff1a; 本产品主要贡献者优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined-青史留名&#xff0c;时光如川浪淘…

计算机网络练习题

学习这么多啦&#xff0c;那就简单写几个选择题巩固一下吧&#xff01; 1. 在IPv4分组各字段中&#xff0c;以下最适合携带隐藏信息的是&#xff08;D&#xff09; A、源IP地址 B、版本 C、TTL D、标识 2. OSI 参考模型中&#xff0c;数据链路层的主要功能是&#xff08;…

【UE5 C++课程系列笔记】21——弱指针的简单使用

目录 概念 声明和初始化 转换为共享指针 打破循环引用 弱指针使用警告 概念 在UE C 中&#xff0c;弱指针&#xff08;TWeakPtr &#xff09;也是一种智能指针类型&#xff0c;主要用于解决循环引用问题以及在不需要强引用保证对象始终有效的场景下&#xff0c;提供一种可…

Spring Boot 的自动配置,以rabbitmq为例,请详细说明

Spring Boot 的自动配置特性能够大大简化集成外部服务和组件的配置过程。以 RabbitMQ 为例&#xff0c;Spring Boot 通过 spring-boot-starter-amqp 提供了自动配置支持&#xff0c;开发者只需在应用中添加相关依赖并配置必要的属性&#xff0c;Spring Boot 会自动配置所需的连…

2025/1/4期末复习 密码学 按老师指点大纲复习

我们都要坚信&#xff0c;道路越是曲折&#xff0c;前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 现代密码学 第五版 杨波 第一章 引言 1.1三大主动攻击 1.中断…

Vulnhub靶场(Earth)

项目地址 https://download.vulnhub.com/theplanets/Earth.ova.torrent 搭建靶机 官网下载.ova文件双击vm打开导入 获取靶机IP kail终端输入 arp-scan -l 获取靶机 IP 192.168.131.184 信息收集 端口扫描 sudo nmap -sC -sV -p- 192.168.131.184 可以看到开启22端口&…

Linux菜鸟级常用的基本指令和基础知识

前言:很多Linux初学者都会头疼于指令太多记不住&#xff0c;笔者刚学习Linux时也是如此&#xff0c;学习Linux指令时&#xff0c;学了后面的指令&#xff0c;前面的指令也会忘的差不多了&#xff0c;针对于以上这些情况&#xff0c;笔者今天来分享一篇Linux菜鸟级的常用指令的博…

使用SSH建立内网穿透,能够访问内网的web服务器

搞了一个晚上&#xff0c;终于建立了一个内网穿透。和AI配合&#xff0c;还是得自己思考&#xff0c;AI配合才能搞定&#xff0c;不思考只依赖AI也不行。内网服务器只是简单地使用了python -m http.server 8899&#xff0c;但是对于Gradio建立的服务器好像不行&#xff0c;会出…

2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无

2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无 前端代码开源库 关于开源说明&#xff1a;企业服务-招聘信息管理系统-前端uniapp-系统前端开放源代码仅供学习-优雅草科技-目前优雅草科…

HTML——75. 内联框架

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>内联框架</title><style type"text/css">iframe{width: 100%;height: 500px;}</style></head><body><!--iframe元素会创建包含…