Linux系统启动相关:vmlinux、vmlinuz、zImage,和initrd 、 initramfs,以及SystemV 和 SystemD
目录
一、vmlinux、vmlinuz、zImage、bzImage、uImage
二、initrd 和 initramfs
1、initrd(Initial RAM Disk)
2、initramfs(Initial RAM Filesystem)
3、initrd vs. initramfs 对比
4. 如何查看和生成 initramfs
三、SystemV 和 SystemD 的区别
一、vmlinux、vmlinuz、zImage、bzImage、uImage
vmlinux
是编译出来的最原始的内核文件,未经压缩的原始Linux内核可执行文件(ELF格式),包含调试符号,体积非常大。
主要用于内核调试(如用GDB分析崩溃),不直接用于启动系统。
vmlinuz
vmlinux
的压缩版本(名称中的 z
表示压缩),去除了调试符号,体积更小,是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接
实际用于系统启动的通用内核文件名称(如 /boot/vmlinuz-<version>
)
zImage
使用gzip压缩的小型内核镜像(适用于老式引导器),大小限制在约512KB
bzImage
Big zImage
,同样压缩但支持更大内核(现代x86系统的标准格式)
大多数x86架构系统的标准启动文件(如 /boot/bzImage-<version>
)
uImage
uboot
专用的内核镜像格式,在zImage/bzImage
前添加U-Boot头(包含加载地址等信息)
嵌入式系统中使用U-Boot引导时必需的文件(如ARM开发板)
二、initrd 和 initramfs
initrd
(Initial RAM Disk)和 initramfs
(Initial RAM Filesystem)都是 Linux 内核在启动过程中使用的临时根文件系统,用于在挂载真正的根文件系统之前提供必要的驱动、工具和脚本。尽管它们的目的一致,但实现方式不同。以下是它们的区别、工作原理及使用场景:
1、initrd(Initial RAM Disk)
-
基于块设备:
initrd
是一个压缩的磁盘映像(通常是gzip
压缩的ext2
或cramfs
文件系统),由引导加载器(如 GRUB)加载到内存。 -
需要挂载:内核将其视为一个块设备(如
/dev/ram0
),并挂载为临时根文件系统(/
)。 -
固定大小:需要预先分配固定大小的内存,可能导致资源浪费或空间不足。
工作流程
(1)引导加载器(如 GRUB)加载内核(vmlinuz
)和 initrd
到内存。
(2)内核解压 initrd
并挂载为临时根文件系统(/
)。
(3)initrd
中的 /linuxrc
或 /init
脚本执行,加载必要的模块(如磁盘驱动、LVM、加密等)。
(4)脚本挂载真正的根文件系统(如 /dev/sda1
),并切换根目录(pivot_root
或 chroot
)。
(5)真正的 init
进程(如 systemd
或 SysVinit
)接管,initrd
被卸载。
由于其基于块设备,效率较低。且大小固定不够灵活,因此现代 Linux 系统已逐渐淘汰initrd,改用initramfs。
2、initramfs(Initial RAM Filesystem)
-
基于 tmpfs(内存文件系统):initramfs是一个
cpio
归档文件(通常用gzip
压缩),直接解压到内核的内存文件系统(tmpfs
)。 -
无需挂载:内核直接将其解压到根文件系统,无需额外的块设备驱动。
-
动态大小:按需使用内存,更高效灵活。
-
现代标准:从 Linux 2.6 开始成为默认机制。
工作流程
-
引导加载器 加载内核(
vmlinuz
)和initramfs
到内存。 -
内核将
initramfs
解压到tmpfs
并作为初始根文件系统(/
)。 -
/init
(通常是 shell 脚本或systemd
)执行,加载必要的驱动和工具。 -
挂载真正的根文件系统,并切换根目录(
pivot_root
)。 -
真正的
init
进程接管,initramfs
被释放。
更快的启动速度(无需挂载块设备)。动态调整大小,节省内存。支持更复杂的早期用户空间(如
systemd
在 initramfs 中运行)。
3、initrd vs. initramfs 对比
特性 | initrd | initramfs |
---|---|---|
存储方式 | 块设备(如 /dev/ram0 ) | tmpfs (内存文件系统) |
格式 | 磁盘映像(ext2 +gzip ) | cpio 归档(gzip 压缩) |
挂载方式 | 需要挂载为块设备 | 直接解压到内存 |
大小 | 固定大小 | 动态调整 |
性能 | 较慢(需块设备访问) | 更快(直接内存访问) |
现代使用 | 已淘汰(旧系统可能使用) | 现代 Linux 默认机制 |
4. 如何查看和生成 initramfs
(1)查看 initramfs 内容
lsinitramfs /boot/initramfs-$(uname -r).img
# 或
unmkinitramfs /boot/initramfs-$(uname -r).img /tmp/initramfs
(2)生成initramfs
# Debian/Ubuntu(使用 update-initramfs)
update-initramfs -u -k $(uname -r)# RHEL/CentOS(使用 dracut)
dracut --force /boot/initramfs-$(uname -r).img $(uname -r)
(3)手动创建 initramfs
# 1. 创建一个简单的 initramfs 目录结构
mkdir -p initramfs/{bin,dev,proc,sys}
# 2. 复制必要的工具(如 busybox)
cp /bin/busybox initramfs/bin/
# 3. 创建 init 脚本(必须是可执行的)
echo -e '#!/bin/sh\nmount -t proc proc /proc\nexec /bin/sh' > initramfs/init
chmod +x initramfs/init
# 4. 打包成 cpio.gz
(cd initramfs && find . | cpio -H newc -o | gzip > ../initramfs.cpio.gz)
三、SystemV 和 SystemD 的区别
SystemV 和 SystemD 是 Linux 系统中两种不同的初始化(init)系统,用于管理系统的启动和服务。
特性 | SystemV (SysV) | SystemD |
---|---|---|
启动方式 | 顺序执行脚本(串行) | 并行启动服务 |
运行级别 | 0-6(如 runlevel3=多用户模式) | 使用 target (如 multi-user.target ) |
服务管理 | /etc/init.d/ 脚本 + service /chkconfig | systemctl + .service 单元文件 |
日志管理 | 依赖 syslog | 内置 journalctl |
依赖管理 | 手动定义启动顺序 | 自动依赖解析 |
默认配置文件 | /etc/inittab | /etc/systemd/system/default.target |
根据Linux内核驱动流程,在架构有关的汇编代码完成特定初始化后,会调用start_kernel开始内核的初始化工作;
- start_kernel函数中有关根文件系统挂载的简要执行流程概述如下:
start_kernel→ vfs_caches_init()→ mnt_init()→ init_rootfs() // 注册rootfs→ init_mount_tree() // 挂载rootfs到/→ rest_init()→ kernel_init()→ do_basic_setup()→ populate_rootfs() // 处理initramfs/initrd→ 检查/init是否存在?→ 是:执行init_post() // 用户空间接管→ 否:prepare_namespace()→ mount_root() // 挂载真实根文件系统→ sys_mount(".", "/", MS_MOVE) // 切换根目录
- 其中,rest_init函数中依次创建了三个进程,idle进程,init进程以及kthreadd进程;
- kernel_init函数中调用do_basic_setup函数,解压释放initramfs类型文件系统到rootfs的根目录,其中就必须包括
/init
可执行文件;
对于采用SystemV管理的系统
在系统启动过程中,/init可执行文件通常是init程序本身,在制作initramfs根文件系统时,需要将init程序打包进去,并确保/init指向这个init程序。init程序启动后,会读取/etc/inittab文件来确定系统的默认运行级别,并执行相应的脚本。
具体步骤如下:
- 制作initramfs根文件系统时,将init程序打包进去。
- 创建/init到init程序的软链接。
- init程序启动后,读取/etc/inittab文件,确定系统的默认运行级别。
- 根据运行级别,init程序会执行/etc/rc.d/rc script,该脚本会进一步调用/etc/rc.d/rc<number>脚本(其中<number>是运行级别)。
- /etc/rc.d/rc<number>脚本会启动或停止相应的服务,以完成系统的初始化过程。
对于采用SystemD管理的系统,
- 实际上
/init
可执行文件是systemd的符号链接,所以在init_post函数中执行的用户进程即为systemd; - 在制作initramfs根文件系统时,将systemd程序也打包进去,创建
/init
到systemd的软链接,即可启动systemd; - systemd启动后,完成后续的linux操作系统加载过程。
相关文章:
Linux系统启动相关:vmlinux、vmlinuz、zImage,和initrd 、 initramfs,以及SystemV 和 SystemD
目录 一、vmlinux、vmlinuz、zImage、bzImage、uImage 二、initrd 和 initramfs 1、initrd(Initial RAM Disk) 2、initramfs(Initial RAM Filesystem) 3、initrd vs. initramfs 对比 4. 如何查看和生成 initramfs 三、Syste…...
单序列双指针---初阶篇
目录 相向双指针 344. 反转字符串 125. 验证回文串 1750. 删除字符串两端相同字符后的最短长度 2105. 给植物浇水 II 977. 有序数组的平方 658. 找到 K 个最接近的元素 1471. 数组中的 k 个最强值 167. 两数之和 II - 输入有序数组 633. 平方数之和 2824. 统计和小于…...
K8s CoreDNS 核心知识点总结
文章目录 一、章节介绍背景与主旨核心知识点及面试频率 二、知识点详解1. CoreDNS 概述2. 工作原理(高频考点)服务发现流程 3. 配置与插件系统(高频考点)核心配置文件:Corefile常用插件 4. Pod DNS策略(中频…...
Java视频流RTMP/RTSP协议解析与实战代码
在Java中实现视频直播的输入流处理,通常需要结合网络编程、多媒体处理库以及流媒体协议(如RTMP、HLS、RTSP等)。以下是实现视频直播输入流的关键步骤和技术要点: 1. 视频直播输入流的核心组件 网络输入流:通过Socket或…...
卓力达电铸镍网:精密制造与跨领域应用的创新典范
目录 引言 一、电铸镍网的技术原理与核心特性 二、电铸镍网的跨领域应用 三、南通卓力达电铸镍网的核心优势 四、未来技术展望 引言 电铸镍网作为一种兼具高精度与高性能的金属网状材料,通过电化学沉积工艺实现复杂结构的精密成型,已成为航空航天、电…...
label-studio功能常用英文翻译
Projects 项目 Settings 设置 Labeling Interface 标注界面 1、Computer Vision 计算机视觉 Semantic Segmentation with Polygons 多边形语义分割 Semantic Segmentation with Masks 掩码语义分割 Object Detection with Bounding Boxes 边界框目标检测 Keypoint Label…...
2025年PMP 学习十六 第11章 项目风险管理 (总章)
2025年PMP 学习十六 第11章 项目风险管理 (总章) 第11章 项目风险管理 序号过程过程组1规划风险管理规划2识别风险规划3实施定性风险分析规划4实施定量风险分析规划5规划风险应对执行6实施风险应对执行7监控风险监控 目标: 提高项目中积极事件的概率和…...
Jenkins 执行器(Executor)如何调整限制?
目录 现象原因解决 现象 Jenkins 构建时,提示如下: 此刻的心情正如上图中的小老头,火冒三丈,但是不要急,因为每一次错误,都是系统中某个环节在说‘我撑不住了’。 原因 其实是上图的提示表示 Jenkins 当…...
Jenkins 安装与配置指南
Jenkins 安装与配置指南(MD 示例) markdown Jenkins 安装与配置指南 ## 一、环境准备 1. **系统要求** - 操作系统:Linux/macOS/Windows - Java 版本:JDK 8 或更高(建议 JDK 11)2. **安装方式** - **L…...
使用unsloth对Qwen3在本地进行微调
Fine-tune Qwen3(100% locally) 使用unsloth进行微调,使用huggingface在本地运行model。 load model from unsloth import FastLanguageModel import torchMODEL = "unsloth/Qwen3-14B" model,tokenizer = FastLanguageModel.from_pretrained(model_name=MODE…...
GpuGeek 实操指南:So-VITS-SVC 语音合成与 Stable Diffusion 文生图双模型搭建,融合即梦 AI 的深度实践
GpuGeek 实操指南:So-VITS-SVC 语音合成与 Stable Diffusion 文生图双模型搭建,融合即梦 AI 的深度实践 前言 本文将详细讲解 So-VITS-SVC 语音合成与 Stable Diffusion 文生图的搭建方法,以及二者与即梦 AI 融合的实践技巧,无论你…...
CSS- 3.1 盒子模型-块级元素、行内元素、行内块级元素和display属性
本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 点…...
使用exceljs将excel文件转化为html预览最佳实践(完整源码)
前言 在企业应用中,我们时常会遇到需要上传并展示 Excel 文件的需求,以实现文件内容的在线预览。经过一番探索与尝试,笔者最终借助 exceljs 这一库成功实现了该功能。本文将以 Vue 3 为例,演示如何实现该功能,代码示例…...
7. 进程控制-进程替换
目录 1. 进程替换 1.1 单进程版: 1.2 进程替换的原理 1.3 多进程版-验证各种程序替换接口 2. 进程替换的各种接口 2.1 execl 2.2 execlp 2.3 execv 2.4 execvp 2.5 execle 1. 进程替换 上图为程序替换的接口,之后会详细介绍。 1.1 单进程版&am…...
关于计算机系统和数据原子性的联系
目录 1、计算机架构 1.1、处理器架构 1.2、内存寻址能力 1.3、性能差异 1.4、软件兼容性 1.5、指令集 1.6、开发和维护 2.、基本数据类型 3、原子类型 3.1、基本概念 3.2、基本数据类型的原子性 3.3、原子操作的解释 3.4、不保证原子性 3.5、解决方案 4、原子性…...
Armijo rule
非精线搜索步长规则Armijo规则&Goldstein规则&Wolfe规则_armijo rule-CSDN博客 [原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则 – 编码无悔 / Intent & Focused...
从数据包到可靠性:UDP/TCP协议的工作原理分析
之前我们已经使用udp/tcp的相关接口写了一些简单的客户端与服务端代码。也了解了协议是什么,包括自定义协议和知名协议比如http/https和ssh等。现在我们再回到传输层,对udp和tcp这两传输层巨头协议做更深一步的分析。 一.UDP UDP相关内容很简单…...
Prometheus实战教程:k8s平台-Mysql监控案例
配置文件优化后的 Prometheus 自动发现 MySQL 实例的完整 YAML 文件。该配置包括: MySQL Exporter 部署:使用 ConfigMap 提供 MySQL 连接信息。Prometheus 自动发现:通过 Kubernetes 服务发现自动抓取 MySQL 实例。 1、mysql 配置文件 &…...
执行apt-get update 报错ModuleNotFoundError: No module named ‘apt_pkg‘的解决方案汇总
Ubuntu版本ubuntu18.04 报错内容: //执行apt-get upgrade报错: Traceback :File “/usr/lib/cnf-update-db”, line 8, in <module>from CommandNotFound.db.creator import DbcreatorFile “/usr/lib/python3/dist-packages/CommandNotFound/db…...
QT6 源(101)篇一:阅读与注释 QPlainTextEdit,其继承于QAbstractScrollArea,属性学习与测试
(1) (2) (3)属性学习与测试 : (4) (5) 谢谢...
Redis(2):Redis + Lua为什么可以实现原子性
Redis 作为一款高性能的键值对存储数据库,与 Lua 脚本相结合,为实现原子性操作提供了强大的解决方案,本文将深入探讨 Redis Lua 实现原子性的相关知识 原子性概念的厘清 在探讨 Redis Lua 的原子性之前,我们需要明确原子性的概念…...
ios打包ipa获取证书和打包创建经验分享
在云打包或本地打包ios应用,打包成ipa格式的app文件的过程中,私钥证书和profile文件是必须的。 其实打包的过程并不难,因为像hbuilderx这些打包工具,只要你输入的是正确的证书,打包就肯定会成功。因此,证书…...
Python生成器:高效处理大数据的秘密武器
生成器概述 生成器是 Python 中的一种特殊迭代器,通过普通函数的语法实现,但使用 yield 语句返回数据。生成器自动实现了 __iter__() 和 __next__() 方法,因此可以直接用于迭代。生成器的核心特点是延迟计算(lazy evaluation&…...
C++11(2)
文章目录 右值引用和移动语义在传参中的提效list容器push_back & insert右值版本的模拟实现类型分类 (了解即可)引用折叠万能引用 完美转发(跟引用折叠有关) 简介:这篇文章是继续介绍C11的一些新语法知识点,也是对…...
unity terrain 在生成草,树,石头等地形障碍的时候,无法触发碰撞导致人物穿过模型
1.terrain地形的草,石头之类要选择模型预制体 2.在人物身上挂碰撞器和刚体,或者单挂一个character controller组件也行 3.在预制体上挂碰撞盒就好了,挂载meshcollider会导致碰撞无效...
以项目的方式学QT开发C++(二)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
API 描述 函数原型 参数说明 push_back() 在 list 尾部 添加一个元素 void push_back(const T& value); value :要添 加到尾部的元 素 这个示例演示了如何创建 std::list 容器,并对其进行插入、删除和迭代操作。在实际应用中&am…...
养生:健康生活的极简攻略
在追求高效生活的当下,养生也能化繁为简。通过饮食、运动、睡眠与心态的精准调节,就能轻松为健康续航。 饮食上,遵循 “均衡、节制” 原则。早餐用一杯热豆浆搭配水煮蛋和半个苹果,唤醒肠胃活力;午餐以糙米饭为主食&am…...
C语言-8.数组
8.1数组 8.1.1初试数组 如何写一个程序计算用户输入的数字的平均数? #include<stdio.h> int main() {int digit;//输入要求平均数的数字double sum=0;//记录输入数字的和int count=0;//记录输入数字的个数printf("请输入一组数字,用来求平均数,以-1结束\n&quo…...
代码随想录算法训练营第四十一天
LeetCode题目: 739. 每日温度496. 下一个更大元素 I503. 下一个更大元素 II 其他: 今日总结 往期打卡 739. 每日温度 跳转: 739. 每日温度 学习: 代码随想录公开讲解 问题: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer &…...
c++,windows,多线程编程详细介绍
目录 一、C11 标准库 <thread> 实现多线程编程1. 基本线程创建2. 线程管理3. 线程传参4. 同步机制5. 异步编程 二、Windows API 实现多线程编程1. 基本线程创建2. 线程管理3. 线程传参 三、两种方法的对比 在 Windows 平台上使用 C 进行多线程编程,可以通过 C…...
Python多线程
Python多线程 作为一名Python开发者,你是否遇到过这样的场景:程序需要同时处理多个任务,但单线程执行效率太低?这时候,多线程技术就能派上用场了。本文将带你深入浅出地理解Python多线程,并通过丰富的示例…...
VisionPro斑点寻找工具Blob
斑点寻找工具Blob 斑点概述 斑点分析 探测并且分析图像中的二维形状Blob是先根据用户设定好的灰阶范围对图像进行分割,然后对目标进行查找和分析。斑点报告多种属性: 面积质心周长主轴…….. 应用场景 Blob分析非常适合以下场合的应用: 对…...
【Python】【面试凉经】Fastapi为什么Fast
核心的关键词:ASGI、原生异步、协程、uvloop、异步生态、Pydantic编译时生成校验代码、DI system预计算依赖树 interviewer 00:32:49 FastAPI 它优越于其他一些主流web框架像 django或 flask 的这个点在哪里? 我 00:33:00fastapi 就是说它的 fast 性能高…...
LocalDateTime类型的时间在前端页面不显示或者修改数据时因为LocalDateTime导致无法修改,解决方案
1.数据库中的时间数据,在控制台可以正常返回,在前端无法返回,即显示空白,如下图所示: 2.这种问题一般时由于数据库和我们实体类的名称不一致引起的,我们数据库一般采用_的方式命名,但是在Java中我们一般采用…...
【Linux】gcc从源码编译安装,修改源码,验证修改的源码
前阵子电脑使用的win10,win10过几天就让升级,烦得不行。 然后把操作系统切换到ubuntu24的样子,然后也是让升级,又烦的不行,然后切换到ubuntu server版本,感觉用起来要舒服些了,至少不会天天让升级。 回到标…...
牛客网NC22157:牛牛学数列2
牛客网NC22157:牛牛学数列2 📝 题目描述 🔍 输入输出说明 输入描述: 输入一个整数 N,范围在 0 到 1000 输出描述: 输出一个保留6位小数的浮点数 示例: 输入:2输出:1.500000 …...
智能手表集成测试报告(Integration Test Report)
📄 智能手表集成测试报告(Integration Test Report) 项目名称:Aurora Watch S1 测试阶段:系统集成测试 测试周期:2025年xx月xx日 – 2025年xx月xx日 报告编号:AW-S1-ITR-2025-001 版本…...
1C:ENTERPRISE 8.3 实用开发者指南-示例和标准技术(Session1-Session3)
1C:ENTERPRISE 8.3(1课-3课) 本博客是全网首个关于1C:Enterprice的中文指南,支持快速吸收使用 1C:Enterprise 8.3 软件开发和调整应用程序的技术 在这篇博客中我会基于实际应用示例,演示各种系统对象的结构、功能和用法。使用内…...
AgenticSeek开源的完全本地的 Manus AI。无需 API,享受一个自主代理,它可以思考、浏览 Web 和编码,只需支付电费。
一、软件介绍 文末提供程序和源码下载 AgenticSeek开源的完全本地的 Manus AI。无需 API,享受一个自主代理,它可以思考、浏览 Web 和编码,只需支付电费。这款支持语音的 AI 助手是 Manus AI 的 100% 本地替代品 ,可自主浏览网页…...
Java类一文分解:JavaBean,工具类,测试类的深度剖析
解锁Java类的神秘面纱:从JavaBean到测试类的深度剖析 前言一、JavaBean 类:数据的守护者(一)JavaBean 类是什么(二)JavaBean 类的特征(三)JavaBean 类的使用场景(四&…...
2025认证杯数学建模第二阶段C题:化工厂生产流程的预测和控制,思路+模型+代码
2025认证杯数学建模第二阶段思路模型代码,详细内容见文末名片 一、探秘化工世界:问题背景大揭秘 在 2025 年 “认证杯”数学中国数学建模网络挑战赛第二阶段 C 题中,我们一头扎进了神秘又复杂的化工厂生产流程预测与控制领域。想象一下&…...
day 17 无监督学习之聚类算法
一、聚类流程 1. 利用聚类发现数据模式 无监督算法中的聚类,目的就是将数据点划分成不同的组或 “簇”,使得同一簇内的数据点相似度较高,而不同簇的数据点相似度较低,从而发现数据中隐藏的模式。 2. 对聚类后的类别特征进行可视…...
渗透测试流程-上篇
#作者:允砸儿 #日期:乙巳青蛇年 四月十八 本期就开始进入到网安的内容了笔者会和大家一起开始实操练习。在此之前笔者的老师和我说要知己知彼,胆大心细。笔者也把他的理念传出去,网安的知识比较复杂且使用的工具很多。笔者看过…...
Ubuntu离线安装Minio
MinIO 支持在 Linux 环境下离线安装,非常适合内网或无法联网的服务器环境。下面是详细的 Linux 离线安装 MinIO 服务端 的步骤: ✅ 一、准备工作 1. 创建安装目录(可选) mkdir -p /opt/minio cd /opt/minio2. 下载 MinIO 可执行…...
2025年山东省数学建模F题思路
2025年山东省数学建模F题思路 一、问题背景 在现代金融市场中,资产价格波动呈现出非线性、高噪声、强跨市场联动性等复杂动态特征。例如,2020年新冠疫情期间,美股数次熔断事件引发全球股市剧烈震荡;而2023年美元加息周期&#x…...
C++核心编程--3 函数提高
函数的一些高级用法。 3.1 函数形参默认值 C中,函数的形参可以有默认值,调用函数时,未进行赋值的形参会使用默认值 void func(int f_var1 10, int f_var2 20); // 声明 void func(int f_var1, int f_var2) // 定义 {std::cout <&l…...
AI Agent开发第67课-彻底消除RAG知识库幻觉(1)-文档分块全技巧
开篇 在上篇《AI Agent开发第66课-彻底消除RAG知识库幻觉-带推理的RAG》放出后,网友们反响很大。有得告诉我:原来还有Rewrite这么一招?早知道这一招很多之前的一些遗留问题都能解决了。不过在上一篇结尾我已经提到了,要真正解决一个AI Agent在响应时产生的幻觉我们用提示语…...
c++多态面试题之(析构函数与虚函数)
有以下问题展开 析构函数要不要定义成虚函数?基类的析构函数要不要定义成虚函数?如果不定义会有什么问题,定义了在什么场景下起作用。 1. 基类析构函数何时必须定义为虚函数? 当且仅当通过基类指针(或引用)…...
buildroot使用外部编译链编译bluez蓝牙工具
buildroot使用外部编译链编译bluez蓝牙工具 主要参见这个csdn buildroot使用外部编译链编译bluez蓝牙工具_bluez编译-CSDN博客 设置交叉编译工具路径时,设置到bin目录之前 如果menuconfig不能改路径,就去 .config下去改 这样才能编译过...
自定义类型:结构体
1.结构体类型的声明 1.1.1结构的声明 struct tag {member-list; }variable-list; 描述一个学生:只包含了学生的名字、年龄、性别、学号 struct Stu {char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号 }; 1.1.2 结构体变量的创建和初始…...