Linux编译Kernel时的文件zImage、文件dtb(dtbs)、核心模块分别是什么东西?
zImage文件的介绍
在编译Linux内核时,zImage
是一种内核映像文件,它是内核的压缩版本,通常用于引导嵌入式设备或其他资源有限的环境。
zImage
的具体含义
zImage
是 “Compressed Kernel Image” 的缩写。- 它是通过压缩原始的内核映像(
vmlinux
)生成的,使用了如 gzip 的压缩算法。 - 包含了一个解压缩程序,当系统启动时,解压缩程序会在内存中将内核解压缩并加载到正确的位置。
zImage
的生成过程
-
编译内核源码
- 编译内核源码后生成一个未压缩的内核映像文件
vmlinux
。
- 编译内核源码后生成一个未压缩的内核映像文件
-
压缩
vmlinux
- 使用 gzip 等压缩算法对
vmlinux
压缩。
- 使用 gzip 等压缩算法对
-
添加解压缩程序
- 将一个小型解压缩程序与压缩后的内核一起打包,生成
zImage
。
- 将一个小型解压缩程序与压缩后的内核一起打包,生成
为什么需要 zImage
?
-
内存限制
- 压缩后的内核更小,适合那些内存有限的设备(如嵌入式设备或老旧硬件)。
-
快速传输
- 压缩后的文件大小较小,可以更快地从存储设备加载到内存。
-
引导方便
- 包含了解压缩程序,便于系统引导时直接解压缩加载。
zImage
的工作原理
- 在启动时,Bootloader(如 GRUB、U-Boot)加载
zImage
。 zImage
的解压缩程序先运行,将压缩的内核解压缩到内存的高地址。- 解压后的内核开始运行,完成引导过程。
zImage
和 vmlinuz
的区别
-
zImage
- 更适合内存有限或嵌入式环境。
- 解压缩后内核加载在内存的高地址。
-
vmlinuz
- 是另一个压缩内核映像文件,常用于 PC 或服务器。
- 压缩方式可能与
zImage
类似,但解压缩后内核通常加载到较低的内存地址。
如何生成和使用 zImage
-
编译内核时可以通过配置生成
zImage
文件:make zImage
文件通常位于
arch/<architecture>/boot/
目录下。 -
嵌入式环境下,Bootloader(如 U-Boot)可以直接加载
zImage
。
总结
zImage
是一种压缩的 Linux 内核映像,主要用于资源有限的设备。它包含了解压缩程序,能够在引导过程中自动解压缩并加载内核。这种设计确保了内核映像的尺寸小巧,同时保持引导的灵活性和效率。
dtbs文件的介绍
在编译Linux内核时,dtbs
文件是 Device Tree Blob(s) 的缩写。它们是设备树(Device Tree)数据的二进制形式,用于描述嵌入式系统中的硬件配置和资源信息。
什么是设备树(Device Tree)?
设备树是一个数据结构,用于向操作系统内核描述硬件的配置,而无需直接在内核代码中进行硬编码。这种机制主要用于嵌入式设备,例如单板计算机(Raspberry Pi、BeagleBone)、ARM架构系统等。
- 设备树的作用:
- 描述硬件资源和拓扑,例如 CPU、内存、GPIO、I2C、SPI 总线等。
- 告诉内核如何与这些硬件交互。
- 提供一种灵活的方式支持多种硬件平台,而无需为每种平台单独修改内核代码。
设备树的组成
设备树通常包含以下几部分:
- 根节点(root node)
- 描述整个硬件系统的信息,例如系统名称、架构等。
- 子节点
- 每个子节点描述一个硬件设备(如内存、串口、总线控制器等)。
- 属性
- 每个节点包含的键值对,用来具体描述设备特性(如地址范围、中断号等)。
dtbs 文件的生成过程
-
源码文件(
.dts
和.dtsi
).dts
(Device Tree Source) 是设备树的原始文本描述。.dtsi
(Device Tree Source Include) 是可被包含的共享设备树文件,通常用于描述通用硬件配置。
-
编译设备树
- 使用设备树编译器(
dtc
)将.dts
文件编译为二进制格式.dtb
(Device Tree Blob)。 - 在编译内核时,运行
make dtbs
会自动生成所需的.dtb
文件。
- 使用设备树编译器(
dtbs 文件的作用
- 独立硬件描述:通过
dtbs
文件,内核可以在启动时获取设备的硬件信息,而无需为每个设备定制一个内核版本。 - 引导过程中加载:Bootloader(如 U-Boot)会在启动时将
dtbs
文件与内核一起加载,内核据此初始化硬件资源。 - 动态支持多个平台:同一个内核可以搭配不同的设备树文件,支持多种硬件平台。
dtbs 文件的位置
- 编译完成后,设备树二进制文件通常位于:
例如:arch/<architecture>/boot/dts/
arch/arm/boot/dts/
如何使用 dtbs 文件
-
与内核一起加载:
在嵌入式设备中,Bootloader(如 U-Boot)负责加载zImage
或uImage
内核,同时加载对应的dtb
文件。例如:bootz 0x80000 - 0x40000
这里
0x80000
是内核地址,0x40000
是设备树地址。 -
测试设备树文件:
使用dtc
工具将.dtb
文件反编译为可读的.dts
文件,检查内容:dtc -I dtb -O dts -o output.dts input.dtb
总结
dtbs
文件 是设备树的二进制形式,描述了硬件配置,为内核提供启动所需的硬件信息。- 它的存在简化了硬件支持,尤其是在嵌入式系统中,通过更改
dtbs
文件而非修改内核代码,就可以支持不同的硬件平台。 - 编译生成这些文件的命令是:
make dtbs
内核模块的介绍
在编译Linux内核时,内核模块(Kernel Module) 是一种可加载的程序,可以动态地添加到运行中的内核中,扩展其功能。内核模块是Linux内核模块化设计的重要特性。
内核模块的特点
-
动态加载
- 内核模块可以在内核运行时按需加载,无需重启系统。
-
动态卸载
- 不需要时可以将模块从内核中移除,释放系统资源。
-
功能扩展
- 通过模块化设计,内核可以根据需要加载驱动程序、文件系统、网络协议等,而不必将所有功能都直接编译进内核。
内核模块的用途
内核模块被广泛应用于以下场景:
-
设备驱动程序
- 支持各种硬件设备(如网卡、显卡、存储设备等)。
-
文件系统支持
- 加载和支持不同的文件系统(如 ext4、xfs、nfs)。
-
网络协议
- 增加对特定网络协议的支持(如 VPN 协议、无线协议等)。
-
安全模块
- 提供额外的安全功能(如 SELinux 模块)。
-
调试和实验
- 开发和测试新的内核功能,方便在运行时进行实验。
内核模块的生成和加载
-
编译内核模块
- 配置内核时,某些功能可以选择作为模块(
M
)编译。例如:
在菜单中选择某些功能作为模块,保存配置后运行:make menuconfig
生成的模块会被保存为make modules
.ko
文件(Kernel Object 文件),通常位于drivers/
或fs/
等目录中。
- 配置内核时,某些功能可以选择作为模块(
-
安装模块
- 使用以下命令将模块安装到系统的模块目录(通常是
/lib/modules/<kernel_version>/
):make modules_install
- 使用以下命令将模块安装到系统的模块目录(通常是
-
加载模块
- 使用
insmod
或modprobe
命令加载模块:
或:sudo insmod my_module.ko
sudo modprobe my_module
- 使用
-
卸载模块
- 使用
rmmod
命令卸载模块:sudo rmmod my_module
- 使用
-
查看加载的模块
- 使用
lsmod
命令查看当前加载的模块:lsmod
- 使用
内核模块的优点
-
灵活性
- 可以根据需要动态加载和卸载功能,而不必重新编译或重启内核。
-
降低内核体积
- 将不常用的功能编译为模块,而不是直接嵌入内核,减小内核体积。
-
便于调试
- 在模块中调试功能时,不需要重新构建整个内核,只需重新编译模块并加载。
内核模块的文件格式
- 内核模块以
.ko
(Kernel Object) 文件形式存在。 - 它是一个二进制文件,包含了目标代码以及相关的符号信息,用于内核加载。
模块的依赖管理
- 模块之间可能存在依赖关系,例如一个模块需要另一个模块的功能。
- 使用
modprobe
可以自动解决依赖关系,而insmod
需要手动管理依赖。 - 模块的依赖信息存储在
/lib/modules/<kernel_version>/modules.dep
文件中,使用depmod
命令生成。
示例:编写和加载简单模块
以下是一个简单的内核模块示例:
#include <linux/module.h>
#include <linux/kernel.h>int init_module(void)
{printk(KERN_INFO "Hello, Kernel Module Loaded!\n");return 0;
}void cleanup_module(void)
{printk(KERN_INFO "Goodbye, Kernel Module Unloaded!\n");
}MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A Simple Kernel Module");
编译模块:
make
加载模块:
sudo insmod hello.ko
卸载模块:
sudo rmmod hello
查看日志输出:
dmesg
总结
- 内核模块是 Linux 内核的一种扩展机制,允许动态加载和卸载功能模块。
- 它的使用极大地增强了内核的灵活性,同时减小了核心内核的体积。
- 通过编译模块(
.ko
文件),用户可以根据需要添加或移除特定的内核功能,无需重新编译整个内核。
相关文章:
Linux编译Kernel时的文件zImage、文件dtb(dtbs)、核心模块分别是什么东西?
zImage文件的介绍 在编译Linux内核时,zImage 是一种内核映像文件,它是内核的压缩版本,通常用于引导嵌入式设备或其他资源有限的环境。 zImage 的具体含义 zImage 是 “Compressed Kernel Image” 的缩写。它是通过压缩原始的内核映像&…...
【深度学习】深刻理解“变形金刚”——Transformer
Transformer 是一种用于处理序列数据的深度学习模型架构,最初由 Vaswani 等人在 2017 年的论文《Attention is All You Need》中提出。它彻底改变了自然语言处理(NLP)领域,成为许多高级任务(如机器翻译、文本生成、问答…...
75_pandas.DataFrame 中查看和复制
75_pandas.DataFrame 中查看和复制 与pandas的DataFrame与NumPy数组ndarray类似,也有视图(view)和拷贝(copy)。 当使用loc[]或iloc[]等选择DataFrame的一部分以生成新的DataFrame时,与原对象共享内存的对…...
打电话玩手机识别-支持YOLO,COCO,VOC格式的标记,超高识别率可检测到手持打电话, 非接触式打电话,玩手机自拍等
打电话玩手机识别-支持YOLO,COCO,VOC格式的标记,超高识别率可检测到手持打电话, 非接触式打电话,玩手机自拍等1275个图片。 手持打电话: 非接触打电话 玩手机 数据集下载 yolov11:https://download.csdn…...
生产慎用之调试日志对空间矢量数据批量插入的性能影响-以MybatisPlus为例
目录 前言 一、一些缘由 1、性能分析 二、插入方式调整 1、批量插入的实现 2、MP的批量插入实现 3、日志的配置 三、默认处理方式 1、基础程序代码 2、执行情况 四、提升调试日志等级 1、在logback中进行设置 2、提升后的效果 五、总结 前言 在现代软件开发中,性能优…...
单片机:实现倒计时(附带源码)
使用单片机实现倒计时功能是一个常见的嵌入式应用,它能帮助你更好地理解如何进行时间控制和如何通过定时器实现精确的倒计时。通过该项目,你将学习如何使用单片机的定时器来进行时间计算,并通过LED或LCD显示倒计时的结果。 1. 项目概述 倒计…...
什么是多线程中的上下文切换
什么是多线程中的上下文切换 回答 上下文切换是指CPU从一个线程转到另一个线程时,需要保存当前线程的上下文状态,恢复另一个线程的上下文状态,以便于下一次恢复执行该线程时能够正确地运行。 在多线程编程中,上下文切换是一种常…...
如何在windwos批量拉取go mod
golang go-zero微服务开发,分的rpc项目太多了,变更了公共包,需要手动去拉取,直接一键拉取就好了,创建一个windwos脚本文件 文件名 tidy_all_go_mod.ps1 代码 # 辅助工具拉取go mod tidy # 根目录v99main执行 ./tidy_all_go_mod.ps1 # 定义项目的根目录 $RootDir Get-Locat…...
【Three.js基础学习】29.Hologram Shader
前言 three.js 通过着色器如何实现全息影像,以及一些动态的效果。 一些难点的思维,代码目录 下面图是摄像机视角观看影响上的时候,如何实现光影的渐变,透视以及叠加等。 一、代码 1.index.html <!DOCTYPE html> <html …...
文件包含进阶玩法以及绕过姿态
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理文件包含漏洞的进阶玩法与绕过姿态 不涉及基础原理了 特殊玩法汇总 本地包含 文件包含上传文件 原理: php的文件包含有着把其他文件类型当做php代码执行的功效,文件上传一般会限制后缀&am…...
Markdown编辑器工具--Typora
下载链接...
PyTorch 的 torch.unbind 函数详解与进阶应用:中英双语
中文版 PyTorch 的 torch.unbind 函数详解与进阶应用 在深度学习中,张量的维度操作是基础又重要的内容。PyTorch 提供了许多方便的工具来完成这些操作,其中之一便是 torch.unbind。与常见的堆叠函数(如 torch.stack)相辅相成&am…...
四十六:如何使用Wireshark解密TLS/SSL报文?
TLS/SSL是保护网络通信的重要协议,其加密机制可以有效地防止敏感信息被窃取。然而,在调试网络应用或分析安全问题时,解密TLS/SSL流量是不可避免的需求。本文将介绍如何使用Wireshark解密TLS/SSL报文。 前提条件 在解密TLS/SSL报文之前&…...
【人工智能】OpenAI O1模型:超越GPT-4的长上下文RAG性能详解与优化指南
在人工智能(AI)领域,长上下文生成与检索(RAG) 已成为提升自然语言处理(NLP)模型性能的关键技术之一。随着数据规模与应用场景的不断扩展,如何高效地处理海量上下文信息,成…...
Ubuntu22.04搭建FTP服务器保姆级教程
在网络环境中,文件传输是一项至关重要的任务。FTP(文件传输协议)是一种基于客户端/服务器模式的协议,广泛用于在互联网上传输文件。Ubuntu作为一款流行的Linux发行版,因其稳定性和易用性而广受开发者和系统管理员的喜爱…...
操作系统(4)操作系统的结构
一、无序结构(整体结构或模块组合结构) 1.特点: 以大型表格和队列为中心,操作系统的各部分程序围绕着这些表格进行。操作系统由许多标准的、可兼容的基本单位(称为模块)构成,模块之间通过规定的…...
Python数据分析(OpenCV视频处理)
处理视频我们引入的还是numpy 和 OpenCV 的包 引入方式如下: import numpy as np import cv2 我们使用OpenCV来加载本地视频,参数就是你视频的路径就可以 #加载视频 cap cv2.VideoCapture(./1.mp4) 下面我们进行读取视频 #读取视频 flag,frame cap.re…...
跨域 Cookie 共享
跨域请求经常遇到需要携带 cookie 的场景,为了确保跨域请求能够携带用户的认证信息或其他状态,浏览器提供了 withCredentials 这个属性。 如何在 Axios 中使用 withCredentials 为了在跨域请求中携带 cookie,需要在 Axios 配置中设置 withCr…...
【视频异常检测】Real-Time Anomaly Detection and Localization in Crowded Scenes 论文阅读
文章信息: 发表于:CVPR2015(workshop) 原文链接:https://www.cv-foundation.org/openaccess/content_cvpr_workshops_2015/W04/papers/Sabokrou_Real-Time_Anomaly_Detection_2015_CVPR_paper.pdf Real-Time Anomaly D…...
设计模式12:抽象工厂模式
系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 参考: C设计模式:抽象工厂模式(风格切换案例)_c 抽象工厂-CSDN博客 1.概念 抽象工厂模式(Abstract Factory Pattern)是软件设计…...
论文学习——多种变化环境下基于多种群进化的动态约束多目标优化
论文题目:Multipopulation Evolution-Based Dynamic Constrained Multiobjective Optimization Under Diverse Changing Environments 多种变化环境下基于多种群进化的动态约束多目标优化(Qingda Chen , Member, IEEE, Jinliang Ding , Senior Member, …...
Jenkins参数化构建详解(This project is parameterized)
本文详细介绍了Jenkins中不同类型的参数化构建方法,包括字符串、选项、多行文本、布尔值和git分支参数的配置,以及如何使用ActiveChoiceParameter实现动态获取参数选项。通过示例展示了传统方法和声明式pipeline的语法 文章目录 1. Jenkins的参数化构建1…...
Cerebras 推出 CePO,填补推理与规划能力的关键空白
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
广东省食品销售中高级题库及答案
1.有关食品安全标准的说法正确的是(C)。 A.鼓励性标准 B.推荐性标准 C.强制性标准 D.引导性标准 2.食品经营许可证载明的许可事项发生变化的,食品经营者应当在变化后(D)个工作日内向原发证的食品药品监督管理部门申请变更经营许可。 A.3 B.5 C.7 D.10 3.食品销售经营者对食品…...
JAVA基础-深入理解Java内存模型(一)-- 重排序与先行发生原则(happens-before)
深入理解Java内存模型(一)-- 重排序 很棒的一个关于Java内存模型系列文章,首先感谢作者,转载自深入理解java内存模型系列文章 ,为了方便阅读,做了一些内容整合和重排版。 提纲 Java线程之间的通信对程序…...
【Lambda】java之lambda表达式stream流式编程操作集合
java之lambda表达式&stream流式编程操作集合 1 stream流概念1.1 中间操作1.1.1 无状态操作1.1.2 有状态操作 1.2 终端操作1.2.1 非短路操作1.2.2 短路操作 2 steam流的生成2.1 方式一:数组转为stream流2.2 方式二:集合转为steam流2.3 方式三…...
家具购物小程序+php
基于微信小程序的家具购物小程序的设计与实现 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于微信小程序的家具购物小程序的设计与实现的开发全过程。通过分析基于微信小程序的家具购物小程序的设计与实…...
【GIS教程】使用GDAL-Python将tif转为COG并在ArcGIS Js前端加载-附完整代码
目录 一、数据格式 二、COG特点 三、使用GDAL生成COG格式的数据 四、使用ArcGIS Maps SDK for JavaScript加载COG格式数据 一、数据格式 COG(Cloud optimized GeoTIFF)是一种GeoTiff格式的数据。托管在 HTTP 文件服务器上,可以代替geose…...
VB.net进行CAD二次开发(二)与cad交互
开发过程遇到了一个问题:自制窗口与控件与CAD的交互。 启动类,调用非模式窗口 Imports Autodesk.AutoCAD.Runtime Public Class Class1 //CAD启动界面 <CommandMethod("US")> Public Sub UiStart() Dim myfrom As Form1 New…...
【NLP 11、Adam优化器】
祝你先于春天, 翻过此间铮铮山峦 —— 24.12.8 一、Adam优化器的基本概念 定义 Adam(Adaptive Moment Estimation)是一种基于梯度的优化算法,用于更新神经网络等机器学习模型中的参数。它结合了动量法(Momentum&…...
做a免费网站有哪些/免费推广软件工具
生物信息很多时候要爬数据。最近也看了一些这些方面的。 url<-"要爬取的网址" url.html<-htmlParse(url,encoding"UTF-8") 如果要获得部分信息,则使用XPath方法。 xpath<-"//*[id填写目标id]/span[id细分标签的id] 目标id.node&l…...
网店开店流程步骤/谷歌seo怎么优化
一、先凑整,再补零例如:17 34 ----> 20 30 50 --> 50 1 51二、利用数字的特征例如 17 x 23 ---> (20 - 3) x (20 3) 400 - 9 391三、记住一下开方 1 ~ 10的开方 根号 1 1 根号 6 2.44…...
wordpress php加密/长春seo排名收费
Python输出语句print函数print()函数基本使用打印整形数据打印浮点型数据打印字符型数据>>> print(12)12>>> print(12.5)12.5>>> print(B)B>>> print(WWW.baidu.com)WWW.baidu.com>>> x12>>> print(12)12>>> y…...
zblog wordpress dede/seo自动排名软件
BCGControlBar ("Business Components Gallery ControlBar")是MFC扩展库,使您可以创建具有完全自定义选项(功能区、可自定义工具栏、菜单等)以及一组专业设计的丰富Microsoft Office和Microsoft Visual Studio的应用程序 GUI控件&a…...
网站建设应考虑哪些方面的问题/长沙大型网站建设公司
现象: 现在大多数java开发者使用的IDE都是eclipse,而且一般在一个workspace中,会有很多个项目,有些是open的,有些是关闭的。有时候eclipse在使用过程中会莫名其妙的异常中断关闭,再打开eclipse,…...
joomla 网站建设教程/代运营公司哪家好一些
11.25事物隔离级别事物日志redo undo事物锁 begin; update事物日志性能优化 innodb_flush_log_at_trx_commit0|1|2|3innodb事务日志相关配置; show variables like %innodb_log%;通用日志通用日志:记录对数据库的通用操作,包括错误的SQL语句通…...