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;祝诸位程序猿 / 程序媛 能够早点遇到自己的另一半。…

安装和配置 Apache 及 PHP

安装和配置 Apache 及 PHP # 1. 停止当前 Apache 服务 sudo apachectl stop# 2. 清除现有的 Apache 配置和文件 sudo rm -rf /etc/apache2 sudo rm -rf /usr/sbin/httpd sudo rm -rf /Library/WebServer# 3. 使用 Homebrew 安装 Apache brew install httpd# 4. 启动 Apache su…

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

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

group by 执行顺序

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

通过爬虫方式实现视频号助手发布视频

1、将真实的cookie贴到解压后目录中cookie.txt文件里,修改python代码里的user_agent和video_path, cover_path等变量的值,最后运行python脚本即可; 2、运行之前根据import提示安装一些常见依赖,比如requests等; 3、2025年1月份最新版; 代码如下: import json import…

Docker入门常用命令总结

1.从远程仓库拉取一个纯净的镜像 docker pull docker .io/centos 2.创建并进入容器&#xff08;左外右内&#xff09; docker run --name xxx -dit 镜像id&#xff08;镜像名称:Tag&#xff09; /bin/bash 【参数必须放在镜像ID之前】 -i 让Docker分配一个伪终端&#xff0c;并…

初学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的…

CSS系列(47)-- Animation Timeline详解

前端技术探索系列&#xff1a;CSS Animation Timeline详解 ⏱️ 致读者&#xff1a;探索动画时间线的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Animation Timeline&#xff0c;这个强大的动画控制特性。 基础概念 &#x1f680; 时间线定义 …

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…

Appium 2.0:移动自动化测试的革新之旅

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 在移动应用开发的领域中&#xff0c;Appium 作为一款强大的自动化测试工具&#xf…

Mysql SQL 超实用的7个日期算术运算实例(10k)

文章目录 前言1. 加上或减去若干天、若干月或若干年基本语法使用场景注意事项运用实例分析说明2. 确定两个日期相差多少天基本语法使用场景注意事项运用实例分析说明3. 确定两个日期之间有多少个工作日基本语法使用场景注意事项运用实例分析说明4. 确定两个日期相隔多少个月或多…

VSCode设置ctrl或alt+mouse(left)跳转

总结&#xff1a; &#xff08;1&#xff09;VSCode初次远程连接服务器时&#xff0c;需要在服务器上下载 python 拓展&#xff0c;然后选择对应的环境 &#xff08;2&#xff09;VSCode设置ctrl或altmouse(left)跳转到定义

VBA 64位API声明语句第005讲

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

可扩展性设计架构模式——事件驱动架构

事件驱动架构&#xff08;Event-Driven Architecture, EDA&#xff09;是一种可扩展性设计软件架构模式&#xff0c;它通过事件来触发和通信&#xff08;以事件为核心&#xff09;&#xff0c;实现不同系统组件之间的解耦&#xff08;促进应用程序或系统部件之间的松耦合通信&a…

covid-vaccine-availability-using-flask-server

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

设计模式从入门到精通之(三)单例模式

单例模式&#xff1a;只留一份独特的存在 在现代软件设计中&#xff0c;有些对象是必须确保"独一无二"的&#xff0c;比如程序中的配置管理器、线程池、数据库连接等。如果允许这些对象被反复创建&#xff0c;不仅会浪费系统资源&#xff0c;还可能导致程序逻辑出错。…