linux内核编译流程、驱动加载顺序

内核编译

根据顶层Makefile找到vmlinux目标开始分析:

vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE+$(call if_changed,link-vmlinux)vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)

 根据这个展开 vmlinux-deps := arch/$(SRCARCH)/kernel/vmlinux.lds (head-y init-y core-y libs-y2 drivers-y net-y virt-y libs-y1)

# Externally visible symbols (used by link-vmlinux.sh)
export KBUILD_VMLINUX_OBJS := $(head-y) $(init-y) $(core-y) $(libs-y2) \$(drivers-y) $(net-y) $(virt-y)
export KBUILD_VMLINUX_LIBS := $(libs-y1)
export KBUILD_LDS          := arch/$(SRCARCH)/kernel/vmlinux.lds

上面的xxxx-y就是,每个目录生成的各.o文件集合,会被打包成一个个built-in.a

ifeq ($(KBUILD_EXTMOD),)
# Objects we will link into vmlinux / subdirs we need to visit
init-y          := init/
drivers-y       := drivers/ sound/
drivers-$(CONFIG_SAMPLES) += samples/
net-y           := net/
libs-y          := lib/
core-y          := usr/
virt-y          := virt/
endif # KBUILD_EXTMODcore-y          += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/vmlinux-dirs    := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \$(core-y) $(core-m) $(drivers-y) $(drivers-m) \$(net-y) $(net-m) $(libs-y) $(libs-m) $(virt-y)))vmlinux-alldirs := $(sort $(vmlinux-dirs) Documentation \$(patsubst %/,%,$(filter %/, $(init-) $(core-) \$(drivers-) $(net-) $(libs-) $(virt-))))build-dirs      := $(vmlinux-dirs)
clean-dirs      := $(vmlinux-alldirs)init-y          := $(patsubst %/, %/built-in.a, $(init-y))
core-y          := $(patsubst %/, %/built-in.a, $(core-y))
drivers-y       := $(patsubst %/, %/built-in.a, $(drivers-y))
net-y           := $(patsubst %/, %/built-in.a, $(net-y))
libs-y1         := $(patsubst %/, %/lib.a, $(libs-y))
libs-y2         := $(patsubst %/, %/built-in.a, $(filter-out %.a, $(libs-y)))
virt-y          := $(patsubst %/, %/built-in.a, $(virt-y))

head-y = arch/arm/kernel/head.o

head-y 定义在文件 arch/arm/Makefile 中:
head-y := arch/arm/kernel/head$(MMUEXT).o当不使能 MMU 的话 MMUEXT=-nommu,如果使能 MMU 的话为空,因此 head-y为: 
head-y = arch/arm/kernel/head.o

libs-y = arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o

顶层Makefile中:libs-y          := lib/
在arch/arm/Makefile中,对libs-y又追加了: libs-y := arch/arm/lib/ $(libs-y) 展开后: libs-y = arch/arm/lib lib/ 回到顶层Makefile:
libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
libs-y := $(libs-y1) $(libs-y2)

core-y = usr/built-in.o  kernel/built-in.o ...... arch/arm/crypto/built-in.o

顶层Makefile中:
core-y := usr/
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/在 arch/arm/Makefile 中会对 core-y 进行追加,代码如下
core-$(CONFIG_FPE_NWFPE)        += arch/arm/nwfpe/
# Put arch/arm/fastfpe/ to use this.
core-$(CONFIG_FPE_FASTFPE)      += $(patsubst $(srctree)/%,%,$(wildcard $(srctree)/arch/arm/fastfpe/))
core-$(CONFIG_VFP)              += arch/arm/vfp/
core-$(CONFIG_XEN)              += arch/arm/xen/
core-$(CONFIG_KVM_ARM_HOST)     += arch/arm/kvm/
core-$(CONFIG_VDSO)             += arch/arm/vdso/# If we have a machine-specific directory, then include it in the build.
core-y                          += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
core-y                          += arch/arm/probes/
core-y                          += arch/arm/net/
core-y                          += arch/arm/crypto/
core-y                          += $(machdirs) $(platdirs)

加载顺序

section

编译器在生成.o文件时会根据所生成二进制的不同性质把它们放入相应的section中。例如函数编译后的二进制代码通常放到.text,而const关键字修饰的全局数组会放到.rodata中。GCC有除了默认的section,例如.text、.data、.bss、.debug、.dynsym等,也支持用户自定义section,在后面的内容中我们可以看到Linux大量使用GCC的扩展__attribute__ ((section(“section_name”))生成自定义section
驱动一般都会在初始化函数前面加__init;在Linux中,所有标识为__init的函数如果直接编译进入内核,成为内核镜像的一部分,在连接的时候都会放在.init.text这个区段内--#define _ _init _ _attribute_ _ ((_ _section_ _ (".init.text")))

segment

链接器在进行链接时,会根据链接脚本从输入的.o文件中挑选出感兴趣的section,把它们合并生成新的section,这些新产生的section归属于目标文件的某个segment(段),并出现在目标文件中。例如file1.o和file2.o分别有两个.text,它们在链接后生产的目标文件也会有一个.text,而这个.text既是由file1.o和file2.o的.text合并而来的

驱动加载顺序

1.makefile只能控制编译顺序,因为先编译的,所以在链接的时候分配地址的时候,就会靠前
2.链接脚本指定不同段的链接顺序;所以就产生了不同模块的加载顺序
3.initcall分配段的等级,链接到同一个段的代码,因为makefile,就会有个先后顺序了
4.也即:makefile指定单个section(built-in.a)里各符号的执行顺序,initcall指定多个section合成的segment(vmlinux)的执行顺序

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

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

相关文章

GCN结合Transformer炸场!性能暴涨74%,效率翻3倍

最近发现了两篇效果很妙的GCN结合Transformer的最新工作,分享给大家: MP-GT:通过结合GCN和Transformer方法来增强App使用预测的准确性,实现了74.02%的性能提升,且训练时间减少了79.47%。 MotionAGFormer:结…

MySQL 图形化界面

填完信息之后,圆圈处可以验证是否可以连接数据库 展示所有数据库(因为有的可能连上,却没有数据库显示)

“小红书、B站崩了”,背后的阿里云怎么了?

导语:阿里云不能承受之重 文 | 魏强 7月2日,“小红书崩了”、“B站崩了”等话题登上了热搜。 据第一财经、财联社等报道,7月2日,用户在B站App无法使用浏览历史关注等内容,消息界面、更新界面、客服界面均不可用&…

【python】PyQt5事件机制、定时器原理分析和实战演练

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

2025秋招NLP算法面试真题(十四)-RoBERTa-Bert的改进

RoBERTa:更大更多更强 今天分享一个Bert的改进工作RoBERTa。RoBERTa是训练充分的Bert。 主要掌握以下几点,与Bert相比较,RoBERTa预训练的时候: 动态掩码:comparable or slightly better去掉NSP任务并且更改数据输入格式为全部填充可以跨越多个文档更多数据,更大bsz,更…

《浔川AI社 AI 产品上线公告》——浔川总社(浔川周报第一期 24.7.2pm)

《浔川 Python 社 AI 产品上线公告》 尊敬的用户: 您好! 我们非常高兴地向您宣布,浔川 AI 社经过不懈的努力和创新,现已成功上线 3 款令人瞩目的 AI 产品! 这 3 款 AI 产品分别是: 浔川AI翻译v3.0&#xff…

Qt时间日期处理与定时器使用总结

一、日期时间数据 1.QTime 用于存储和操作时间数据的类,其中包括小时(h)、分钟(m)、秒(s)、毫秒(ms)。函数定义如下: //注:秒(s)和毫秒(ms)有默认值0 QTime::QTime(int h, int m, int s 0, int ms 0) 若无须初始化时间数据,可…

redis 消息订阅命令

在 Redis 中,消息订阅和发布是一种用于实现消息传递的机制。主要命令包括 SUBSCRIBE、UNSUBSCRIBE、PUBLISH 和 PSUBSCRIBE 等。下面是如何使用这些命令的详细说明和示例。 1. SUBSCRIBE 命令 SUBSCRIBE 命令用于订阅一个或多个频道,以接收这些频道发布…

常见sql语句练习

Tips:之前查看网上的文章感觉太乱了,所以自己整理了一套sql语句来练习,主要也可以拿来应对面试,需要的可以自行下载练习 包含基本语句、聚合函数、模糊查询、范围查询、排序、聚合、分组、分页、子查询、索引和视图、左右连接、双…

无人值守过磅管理系统实现数据实时传递

依据为某公司信息化系统建设前提下,客商平台在线预约称重、车辆到场智能排队系统、空车入场取装车票装车、门岗智能管控系统、建设地磅无人值守、进出货场管理系统、手机APP远程派车、查询报表、查询实时过磅数据,集中式监控管理系统,配合无人…

分享快乐,分享5款我认为好用的软件

​ 分享是奉献的果实,分享是快乐的前提。每天给小伙伴们分享自己认可的软件,也是莫大的一种幸福,今天依然带来五款好用的软件。 1.文本编辑——Notepads ​ Notepads是一款简约高效的文本编辑器,专为Windows10及以上版本设计。它…

Debian linux安装最新版Cmake

直接sudo apt install camke不是最新版本 卸载cmake sudo apt autoremove cmake下载cmake cmake官网 最上面的是候选版本,往下滑是最新稳定版 解压(改成自己的包) tar -zxvf cmake-3.30.0-rc4.tar.gz进入解压后的文件夹 lscd cmake-3.3…

每天一个数据分析题(三百九十二)- 多元线性回归

多元线性回归的正规方程组中系数矩阵X’X的阶数等于?(p个变量,n个观测值) A. n B. p-1 C. p D. n-1 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Py…

等保测评——云计算扩展测评项

安全物理环境-基础设施位置 应保证云计算基础设置位于中国境内。 该控制点是针对云计算平台提出的安全要求,公有云服务商和自建私有云的企业或组织在规划设计时应同步考虑此安全要求。无论是自建数据中心还是租赁第三方基础设施,其数据机房及云计算相关…

java常用类(3)

目录 一. 正则表达式 二. Math类 三. Random类 四. Date类 五. Calendar类 六. SimpDateFormate类 七. BigInteger类 八. BigDecimal类 一. 正则表达式 正则表达式(Regular Expression)就是用一些特殊的符号去匹配一个字符串是否符合规则,利用String类中的matches()方…

提升效能:Symfony 性能优化实用指南

Symfony 是一个功能丰富的 PHP Web 框架,但在构建高性能应用程序时,开发者需要考虑多种性能优化策略。本文将探讨一系列实用的 Symfony 性能优化技巧,帮助开发者提高应用程序的响应速度和整体性能。 1. 了解 Symfony 缓存机制 Symfony 提供…

蒙阴蜜桃节:北纬 35 度的甜蜜盛宴

蒙阴,这座位于北纬 35 度黄金水果带的魅力之城,凭借着沙壤土、长日照、大温差、好生态的天然禀赋,孕育出了令人陶醉的“蒙阴蜜桃——北纬 35 度的甜”。 7月2日—3日,主题为“蒙阴好丰景 桃香产业兴”的国家鲁中山区桃产业集群项目…

3d打开模型的时候怎么没有灯光?---模大狮模型网

在3D建模与渲染过程中,灯光是至关重要的元素之一,直接影响到最终场景的视觉效果和真实感。然而,有时打开3D模型时可能会发现缺乏适当的灯光设置,这会导致场景显得暗淡或平淡无奇。本文将探讨为何在打开3D模型时可能没有灯光的原因…

QGC添加添加QML可访问的单例

文章目录 前言一、添加文件二、修改qgroundcontrol.pro三、修改QGCApplication.cc四、修改QGroundControlQmlGlobal.h五、修改QGroundControlQmlGlobal.cc六、测试前言 QGC 4.2 一、添加文件 在src目录下添加文件夹SingletonTest,在里面新建SingletonTest.cc和SingletonTes…

OCR text detect

主干网络 VoVNet:实时目标检测的新backbone网络_vovnet pytorch-CSDN博客 DenseNet: arxiv.org/pdf/1608.06993 密集连接: DenseNet 的核心思想是将网络中的每一层与其前面的所有层直接连接。对于一个 L 层的网络,DenseNet 具有…