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.mzph.cn/bicheng/66106.shtml

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

相关文章

《Vue3实战教程》39:Vue3无障碍访问

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 无障碍访问​ Web 无障碍访问 (也称为 a11y) 是指创建可供任何人使用的网站的做法——无论是身患某种障碍、通过慢速的网络连接访问、使用老旧或损坏的硬件&#xff0c;还是仅处于某种不方便的环境。例如&#xff0c;…

抢先体验:人大金仓数据库管理系统KingbaseES V9 最新版本 CentOS 7.9 部署体验

一、简介 KingbaseES 是中国人大金仓信息技术股份有限公司自主研发的一款通用关系型数据库管理系统&#xff08;RDBMS&#xff09;。 作为国产数据库的杰出代表&#xff0c;它专为中国市场设计&#xff0c;广泛应用于政府、金融、能源、电信等关键行业&#xff0c;以高安全性…

基于 GitHub API 的 Issue 和 PR 自动化解决方案

文章目录 摘要引言优化 Issue 和 PR 管理的方法工具选择流程优化 自动化 Issue 和 PR 管理代码逻辑详解获取 Issue 数据为 Issue 添加标签将 Issue 分配给开发者主逻辑 实际运行效果进一步扩展QA 环节总结参考资料 摘要 在开源项目中&#xff0c;Issue 和 Pull Request&#x…

趣味编程:心形曲线

目录 1.序言 2.代码展示 3.代码详解 3.1 头文件包含 3.2 绘制坐标轴函数 3.3 main 函数主体部分 4. 小结 1.序言 2025年的第一篇博客就用这个笛卡尔心形图开篇吧&#xff0c;寓意着新年大家能够有心有所属&#xff0c;祝诸位程序猿 / 程序媛 能够早点遇到自己的另一半。…

解决uniapp H5页面限制输入框只能输数字问题

工作记录 最最近在做 uniapp 开发的移动端 H5 页面&#xff0c;有个需求是金额输入框只能输入数字&#xff0c;不能输入小数点和其他字符&#xff0c;经过各种尝试&#xff0c;发现其他字符可以通过正则过滤掉&#xff0c;但是输入小数点的话&#xff0c;因为没有触发 input 和…

group by 执行顺序

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 感谢各位大佬写的文章让我学到很多东西&#xff01;只是在各位大佬的基础加了我自己的思路&a…

初学stm32 --- FSMC驱动LCD屏

目录 FSMC简介 FSMC框图介绍 FSMC通信引脚介绍 FSMC_NWE 的作用 FSMC_NWE 的时序关系 FSMC_NOE 的含义 FSMC_NOE 的典型用途 FSMC_NOE 的时序关系 使用FSMC驱动LCD FSMC时序介绍 时序特性中的 OE ILI9341重点时序&#xff1a; FSMC地址映射 HADDR与FSMC_A关系 LCD的…

Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)

文章目录 概述步骤 1: 安装 Nginx 和 Lua 模块步骤 2: 创建 Lua 脚本用于参数校验步骤 3: 配置 Nginx 使用 Lua 脚本写法二&#xff1a; 状态码写法三 &#xff1a; 返回自定义JSON复杂的正则校验 步骤 4: 测试和验证ngx.HTTP_* 枚举值 概述 一个不使用 OpenResty 的 Nginx 集…

GRAPE——RLAIF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)

前言 24年具身前沿模型大汇总 过去的这两年&#xff0c;工作之余&#xff0c;我狂写大模型与具身的文章&#xff0c;加之具身大火&#xff0c;每周都有各种朋友通过CSDN私我及我司「七月在线」寻求帮助/指导(当然&#xff0c;也欢迎各大开发团队与我司合作共同交付&#xff09…

VBA 64位API声明语句第005讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

covid-vaccine-availability-using-flask-server

使用烧瓶服务器获得 Covid 疫苗 原文:https://www . geesforgeks . org/co vid-疫苗-可用性-使用-烧瓶-服务器/ 在本文中&#xff0c;我们将使用 Flask Server 构建 Covid 疫苗可用性检查器。 我们都知道&#xff0c;整个世界都在遭受疫情病毒的折磨&#xff0c;唯一能帮助我们…

hashMap追问

HashMap 7/8区别 不同点&#xff1a; &#xff08;1&#xff09;JDK1.7用的是头插法&#xff0c;而JDK1.8及之后使用的都是尾插法&#xff0c;那么他们为什么要这样做呢&#xff1f;因为JDK1.7是用单链表进行的纵向延伸&#xff0c;当采用头插法时会容易出现逆序且环形链表死…

网络安全:路由技术

概述 路由技术到底研究什么内容 研究路由器寻找最佳路径的过程 路由器根据最佳路径转发数据包 知识点&#xff0c;重要OSRF,BGP1.静态路由原理 路由技术分类 静态路由和动态路由技术 静态路由&#xff1a;是第一代路由技术&#xff0c;由网络管理员手工静态写路由/路径告知路…

计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

分布式光伏规模界点为什么是6MW?

多省能源局规定大于6MW的电站必须按集中式管理&#xff0c;另外大于6MW&#xff08;包含&#xff09;要省级审批&#xff0c;小于则由市级审批&#xff0c;10kV线路单回接入容量也是6MW&#xff0c;很多电厂发电机装机容量也是以6MW为界点。这是什么原因呢&#xff1f; 配电网…

[2474].第04节:Activiti官方画流程图方式

我的后端学习大纲 Activiti大纲 1.安装位置&#xff1a; 2.启动&#xff1a;

Qt从入门到入土(七)-实现炫酷的登录注册界面(下)

前言 Qt从入门到入土&#xff08;六&#xff09;-实现炫酷的登录注册界面&#xff08;上&#xff09;主要讲了如何使用QSS样式表进行登录注册的界面设计&#xff0c;本篇文章将介绍如何对登录注册界面进行整体控件的布局&#xff0c;界面的切换以及实现登录、记住密码等功能。…

在 macOS 上,你可以使用系统自带的 终端(Terminal) 工具,通过 SSH 协议远程连接服务器

文章目录 1. 打开终端2. 使用 SSH 命令连接服务器3. 输入密码4. 连接成功5. 使用密钥登录&#xff08;可选&#xff09;6. 退出 SSH 连接7. 其他常用 SSH 选项8. 常见问题排查问题 1&#xff1a;连接超时问题 2&#xff1a;权限被拒绝&#xff08;Permission denied&#xff09…

121.【C语言】数据结构之快速排序(未优化的Hoare排序存在的问题)以及时间复杂度的分析

目录 1.未优化的Hoare排序存在的问题 测试代码 "量身定制"的测试代码1 运行结果 "量身定制"的测试代码2 运行结果 "量身定制"的测试代码3 运行结果 分析代码1、2和3栈溢出的原因 排有序数组的分析 分析测试代码1:给一个升序数组,要求排…

DC-2 靶场渗透

目录 环境搭建 开始渗透 扫存活 扫端口 扫服务 看一下80端口 看一下指纹信息 使用wpscan扫描用户名 再使用cewl生成字典 使用wpscan爆破密码 登陆 使用7744端口 查看shell rbash绕过 切换到jerry用户 添加环境变量 现在可以使用su命令了 提权 使用git提权 环…