[OS] vDSO + vvar(频繁调用的处理) | 存储:寄存器(高效)和栈(空间大)| ELF标准包装规范(加速程序加载)

vDSO + vvar
一、社区公告板系统(类比 vDSO + vvar)
想象你住在一个大型社区,管理员(内核)需要向居民(用户程序)提供实时信息(如天气预报、社区活动时间等)。直接让每个居民频繁敲门询问管理员效率低下(系统调用开销),于是社区设计了一个公告板系统:
- 公告板(vDSO)
-
- 功能:张贴最新信息(如时间、天气),居民无需敲门即可自行查看
- 特点:包含查看信息的说明手册(用户态函数,如
__vdso_gettimeofday) - 对应技术:
vDSO是内核映射到用户空间的代码库,提供无需系统调用的函数接口
- 数据更新区(vvar)
-
- 功能:管理员在此区域更新数据(如校正时钟),居民无权直接修改
- 特点:只读且受保护(内核特权区域),数据通过公告板间接访问
- 对应技术:
vvar是内核映射的只读数据区,存储时间戳等敏感信息
二、实例解析:获取当前时间
假设你想知道当前时间(调用 gettimeofday),流程如下:
- 传统方式(无 vDSO)
👉 每次都要敲门找管理员(系统调用)→ 耗时且频繁打扰管理员(上下文切换开销) - vDSO + vvar 优化方式
👉 步骤一:查看公告板上的手册(vDSO中的__vdso_gettimeofday函数)
👉 步骤二:按手册指引读取数据更新区(vvar中的时间戳)
👉 步骤三:自行计算结果,全程无需敲门(无系统调用)
通过 vDSO 直接访问 vvar 数据
// 用户程序调用(伪代码)
struct timeval tv;
__vdso_gettimeofday(&tv, NULL); // 通过 vDSO 直接访问 vvar 数据
频繁调用的处理:之后我们要是做什么模块,也存在频繁调用的话,也可以将它封装为一个函数,进行调用时的单独数据获取
三、技术原理与生活场景映射
| 生活场景 | 技术实现 | 关键作用 |
| 公告板上的说明手册 |
| 提供数据访问方法 |
| 数据更新区的时钟 |
| 存放内核维护的实时信息 |
| 管理员定期校正时钟 | 内核更新 | 保证数据准确性 |
| 居民无权修改公告板 |
| 防止用户篡改敏感数据 |
四、总结
vDSO 和 vvar 的协作
- 效率提升:避免频繁打扰管理员(减少系统调用)
- 安全性:居民只能读取预设信息(内核控制数据更新)
- 透明性:用户调用标准函数(如 VDSO
gettimeofday),无需感知底层实现
通过这种设计,Linux 内核为高频但低权限的操作(如时间查询)提供了接近用户态函数的性能。
寄存器和栈
一、场景设定:厨房工作台(寄存器)与储物架(栈)
假设你正在厨房准备一道复杂菜品(执行程序),需要管理食材和工具:
- 操作台(寄存器)
-
- 特点:空间小(仅能放3-4件物品),但取用极快(伸手即得)
- 用途:存放 当前正在使用的食材和工具(如正在切的蔬菜、手中的刀)
- 对应技术:寄存器是CPU内部的高速存储单元,直接参与运算(如
EAX存运算结果)
- 储物架(栈)
-
- 特点:空间大(多层架子),但存取需按顺序(后放的物品先取)
- 用途:临时存放 阶段性用完但稍后还需使用的物品(如切好的洋葱、焯水后的肉)
- 对应技术:栈是内存中的数据结构,用于保存函数调用时的临时变量和返回地址
二、核心区别对比
| 特性 | 寄存器(操作台) | 栈(储物架) |
| 容量 | 极小(3-4个寄存器) | 较大(取决于内存) |
| 速度 | 纳秒级(CPU直接访问) | 微秒级(需通过内存总线 |
| 数据生命周期 | 短暂(仅当前指令使用) | 较长(跨函数调用) |
| 管理方式 | 由编译器硬性分配 | 自动压入/弹出(LIFO) |
| 典型用途 | 存储指令操作数、地址 | 保存函数参数、返回地址、局部变量 |
三、扩展案例:多人协作(多线程)
假设厨房有多个厨师(多线程):
- 每个厨师有自己的操作台(寄存器组):线程私有,互不干扰
- 共享储物架(堆内存):存放公共食材(全局变量),但需协调使用(加锁)
四、总结:为什么需要两种存储?
- 效率优先:寄存器提供闪电般的操作速度,适合高频数据(如循环计数器)
- 灵活性需求:栈支持动态深度的函数调用和临时数据保存(如递归)
- 资源分层:CPU与内存的速度差异决定了分层存储的必要性
通过这种设计,计算机既能高效处理即时运算(寄存器),又能灵活管理复杂任务流程(栈)
ELF

一、ELF文件:智能快递包裹
想象你要从上海寄送一个特殊包裹到北京,这个包裹需要自动组装零件、适配不同运输工具,还能在目的地自动激活功能。
ELF文件就是这样一个智能包裹:
- 包裹清单(ELF头)
-
- 包含发件人/收件人信息(操作系统类型)、包裹总重量(文件大小)、组装说明(程序入口地址)
- 类比:ELF头的
e_type字段标识包裹类型(可执行文件/共享库等),就像快递单上的"文件类"标记
- 分装策略(程序头表 & 节头表)
-
- 程序头表:指导快递员如何分装包裹到不同车厢(内存段),例如易碎品放防震区(代码段只读)、液体单独包装(数据段可写)
- 节头表:详细列出每个小包裹的内容(.text节是机器指令,.data节是初始化数据),就像包裹内的物品清单[
- 动态组装能力(共享库)
包裹中的某些零件(如.so文件)允许在运输途中按需组合,类似乐高积木模块化设计(动态链接)
二、计算机存储体系:物流仓库系统
计算机存储可以类比为多层级的物流中心,每个层级的速度和容量呈金字塔分布:
╔═══════════╗║ CPU寄存器 ║ ← 操作台(直接加工食材,纳秒级)╚═══════════╝▲╔════════════════════╗║ L1/L2缓存 ║ ← 厨房储物柜(存放常用调料,微秒级)╚════════════════════╝▲╔══════════════════════╗║ 内存 ║ ← 餐厅仓库(存放当日食材,毫秒级)╚══════════════════════╝▲╔══════════════════════════╗║ 磁盘/SSD ║ ← 城市中央冷库(长期存储,秒级)╚══════════════════════════╝
各层级特性对比:
| 存储层级 | 类比场景 | 访问速度 | 容量 | 作用 |
| 寄存器 | 厨师手中的刀具(直接使用) | 1纳秒 | 几十字节 | 暂存当前计算的中间结果 |
| 缓存 | 厨房备料台(常用食材) | 10纳秒 | MB级 | 缓存热点数据 |
| 内存 | 餐厅冷藏柜(当日食材) | 100纳秒 | GB级 | 运行中的程序和数据 |
| 磁盘 | 城市冷链中心(长期存储) | 10毫秒 | TB级 | 持久化存储ELF等文件 |
我们可以发现暂存的读取快,持久化的读取慢
感觉硬件也是可以印证软件的《没有银弹-软件工程的本质与偶然》
三、ELF在存储体系中的旅程
以运行 ls 命令为例:
- 冷库提取(磁盘→内存)
系统从/bin/ls读取ELF文件,就像从冷库调取预制菜到厨房(内存加载) - 拆包分装(程序头表解析)
根据程序头表将代码段(.text)装入只读区,全局变量(.data)放入可写区,类似按标签分装食材到不同储物格 - 实时烹饪(寄存器→缓存)
CPU将频繁使用的指令缓存到L1(如循环计数),就像厨师将常用调料放在手边 - 动态调味(共享库加载)
运行时加载libc.so等共享库,类似临时从中央厨房调用特色酱料包(动态链接)
四、扩展:ELF与核心转储
当程序崩溃时,系统会生成"事故现场快照"(core dump),这相当于:
- 物流公司对破损包裹进行X光扫描(记录内存状态)
- 生成详细的损坏报告(寄存器值、堆栈跟踪)
- 这些数据以ELF格式存储,供工程师(调试器)分析事故原因
五、总结:存储体系的协同
- 效率分层:高频数据在顶层(寄存器),低频数据在底层(磁盘),类似物流系统分级管理
- 格式统一:ELF作为标准包装规范,确保不同层级的"货物"能无缝流转
- 动态适应:通过链接视图(快递分装)和执行视图(运输使用)的分离,实现灵活部署[5]
这种设计使得计算机既能闪电般执行指令,又能管理海量数据。
《程序员的自我修养:链接、装载与库》

一、ELF 标准包装规范的核心设计
假设某物流公司推出一款 「ELF 智能环保快递箱」,其设计规范体现了以下原则:
- 材料标准化
-
- 生活实例:箱体必须使用可降解塑料(类似网页4中食品托盘的热压树脂材料),厚度≥0.5mm以保证抗压性
- 技术映射:ELF 标准中材料参数明确如网页2的塑料瓶企业标准,确保不同批次产品性能一致
- 结构分层防护
-
- 生活实例:内部分为代码区(硬质隔层存放电子产品)、数据区(防震泡沫存放易碎品)、动态链接区(可拆卸模块存放配件)
- 技术映射:类似ELF文件的分段装载设计(网页8的Android ELF文件结构),不同区域对应不同保护等级
- 标识规范
-
- 生活实例:包裹外侧必须印刷可回收标志、净含量、生产批次(如网页12要求印刷面积≤50%)
- 技术映射:ELF文件头包含魔数标识"7F 45 4C 46"),如同快递单上的二维码
二、操作流程规范
以工厂包装流水线为例:
- 预处理阶段
👉 质检:核对产品型号与订单一致性
👉 分类:按ELF标准将货物分为可执行件(精密仪器)、共享库(通用配件)、重定位件(组装零件) - 包装阶段
防震层填充 → 真空密封 → 智能标签写入(包含ELF格式的物流追踪码)
-
- 规范要点:每层包装需记录操作员ID(如同ELF节头表的调试信息
- 动态优化
👉 根据运输工具自动调整包装结构(如海运加强防潮层,空运减轻重量)
👉 类似ELF动态链接库按需加载
三、安全与环保要求
| 维度 | 生活实例 | 技术实现 |
| 防篡改 | 封箱胶带内置隐形流水号 | ELF文件的哈希校验段 |
| 循环利用 | 回收箱体自动清洁消毒 | 共享库热替换机制 |
| 减量化 | 根据物品体积自适应装箱 | ELF文件压缩节 |
四、扩展:ELF 标准与计算机存储的关联
ELF 包装规范的设计理念源于计算机系统的分层存储思想
- 快速响应层:包裹面单信息(寄存器级访问)
- 缓冲层:物流中转站缓存(内存级调度)
- 持久层:区域仓储中心(磁盘级存储)
这种多级协作模式,使得从上海发往纽约的包裹能像ELF程序加载般高效:
磁盘读取ELF头 → 内存加载代码段 → 寄存器执行指令
↓ ↓ ↓
仓库调拨 → 干线运输 → 最后一公里配送
五、总结:标准化带来的价值
- 效率提升:统一包装规格使自动化分拣成为可能(如同ELF文件加速程序加载)
- 成本控制:材料用量标准化减少浪费
- 环保合规:通过降解周期参数实现碳足迹追踪
相关文章:
[OS] vDSO + vvar(频繁调用的处理) | 存储:寄存器(高效)和栈(空间大)| ELF标准包装规范(加速程序加载)
vDSO vvar 一、社区公告板系统(类比 vDSO vvar) 想象你住在一个大型社区,管理员(内核)需要向居民(用户程序)提供实时信息(如天气预报、社区活动时间等)。直接让每个居…...
Sentinel源码—1.使用演示和简介二
大纲 1.Sentinel流量治理框架简介 2.Sentinel源码编译及Demo演示 3.Dashboard功能介绍 4.流控规则使用演示 5.熔断规则使用演示 6.热点规则使用演示 7.授权规则使用演示 8.系统规则使用演示 9.集群流控使用演示 5.熔断规则使用演示 (1)案例说明熔断和降级 (2)Sentin…...
IDEA的常用设置(更新中......)
文章目录 1. 自动导包2. 忽略大小写3. 设置项目文件编码格式4. 设置方法之间分割线5. 设置字体大小6. 设置IDEA默认不打开项目持续更新中...... 1. 自动导包 File->Settings->Editor->General>Auto Import 2. 忽略大小写 File->Editor->General->Code…...
SQL注入之时间盲注攻击流程详解
目录 一、时间盲注原理 二、完整攻击流程 1. 注入点确认 2. 基础条件判断 3. 系统信息收集 (1)获取数据库版本 (2)获取当前数据库名 4. 数据提取技术 (1)表名枚举 (2)列名猜…...
【ROS2】行为树 BehaviorTree(三):异步操作
【ROS】郭老二博文之:ROS目录 1、简述 前面的例子中,使用过同步节点 SyncActionNode,当调用到该节点时,成功返回SUCCESS,失败返回FAILURE,并且线程会等待该节点执行完毕。 如果需要异步操作,比如节点执行需要很长时间,不能立刻返回结果,可以先去执行其它任务,等该…...
比特币不是solidity编写吗,比特币不是基于 Solidity
对!你这个问题问得非常精准——比特币不是基于 Solidity 的,而且它和以太坊智能合约的设计思路也完全不同。我们来讲清楚👇 ❌ 比特币不是 Solidity 的! 📌 原因如下: 项目智能合约语言说明比特币&#x…...
c# Kestrel
Kestrel 是 .NET 中用于 ASP.NET Core 应用程序的跨平台 Web 服务器。它是轻量级且高性能的,能够处理大量并发连接,常被用作 ASP.NET Core 应用的默认服务器。以下为你介绍 Kestrel 的基本使用和配置: 基本使用 创建一个简单的 ASP.NET Cor…...
x86 保护模式中的GDT表是什么?
GDT(全局描述符表,Global Descriptor Table)是 x86 保护模式下用于描述不同类型内存段的一个重要数据结构。在保护模式下,GDT 用于管理和保护系统内存,它通过提供一组段描述符来定义内存的访问权限、大小、类型等属性 …...
筛选条件在on和where中的区别(基于hivesql)
理解筛选条件在on和where中的区别,最好先理解sql的执行顺序,尽管实际执行时不同的物理执行引擎可能会有特定的优化,但是逻辑执行顺序必须遵循: 1)from:确定数据源是什么,from后可以是单表&#…...
自然语言处理Hugging Face Transformers
Hugging Face Transformers 是一个基于 PyTorch 和 TensorFlow 的开源库,专注于 最先进的自然语言处理(NLP)模型,如 BERT、GPT、RoBERTa、T5 等。它提供了 预训练模型、微调工具和推理 API,广泛应用于文本分类、机器翻…...
vue3+vite+ts使用daisyui/tailwindcss
vite创建vue3脚手架 npm init vitelatest myVue3 – --template vue cd .\myVue3\ npm i npm run dev 安装tailwindcss/daisyui 依赖安装 npm install -D tailwindcss postcss autoprefixer daisyui npx tailwindcss init -p 这条命令将生成postcss.config.js(因为加了…...
Android常见界面控件、程序活动单元Activity练习
第3章 Android常见界面控件、第4章程序活动单元Activity 一. 填空题 1. (填空题)Activity的启动模式包括standard、singleTop、singleTask和_________。 正确答案: (1) singleInstance 2. (填空题)启动一个新的Activity并且获取这个Activity的返回数据ÿ…...
大模型在直肠癌诊疗全流程预测及应用研究报告
目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究方法与创新点 二、大模型预测直肠癌的原理与技术基础 2.1 大模型技术概述 2.2 用于直肠癌预测的数据来源 2.3 模型构建与训练过程 三、术前预测 3.1 肿瘤分期预测 3.1.1 基于影像组学的 T 分期预测模型…...
大联盟(特别版)双端互动平台完整套件分享:含多模块源码+本地部署环境
这是一套结构清晰、功能完整的互动平台组件,适合有开发经验的技术人员进行模块参考、结构研究或本地部署实验使用。 该平台覆盖前端展示、后端服务、移动端资源以及完整数据库,采用模块化架构,整体部署流程简单清晰,适合自研团队参…...
设计模式:迪米特法则 - 最少依赖,实现高内聚低耦合
一、迪米特法则简介 迪米特法则(Law of Demeter,简称 LoD),也称为“最少知识法则”,核心思想是:一个对象应当对其他对象有最少的了解,仅与直接相关的对象交互。通过减少对象之间的耦合度&#…...
Spark-SQL
Spark-SQL 概述 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块 Shark 是伯克利实验室 Spark 生态环境的组件之一,是基于 Hive 所开发的工具,它修改了内存管理、物理计划、执行三个模块,并使之能运行在 Spark 引擎上…...
多任务响应2(Qt)
多任务响应2 扩展方案1. 设计思路2. 示例代码3. 说明 在多任务响应1的基础上,当任务响应比较复杂时,需要整合多个模块的信息。 扩展方案 利用【中介者模式】或【系统上下文】来整合多个模块的信息,并在命令对象中通过依赖注入(D…...
【MySQL】MVCC工作原理、事务隔离机制、undo log回滚日志、间隙锁
一、什么是MVCC? MVCC,即 Multiversion Concurrency Control(多版本并发控制),它是数据库实现并发控制的一种方式。 MVCC 的核心思想是: 为每个事务提供数据的“快照”版本,从而避免加锁&…...
无人机气动-结构耦合技术要点与难点
一、技术要点 1. 多学科耦合建模 气动载荷与结构响应的双向耦合:气动力(如升力、阻力、力矩)导致结构变形,而变形改变气动外形,进一步影响气流分布,形成闭环反馈。 建模方法: 高精度C…...
七大数据库全面对比:ClickHouse、ES、MySQL等特性、优缺点及使用场景
七大数据库全面对比:ClickHouse、ES、MySQL等特性、优缺点及使用场景 引言 在数字化时代,数据库的选择对于业务的成功至关重要。本文将通过表格形式,对ClickHouse、Elasticsearch(ES)、MySQL、SQL Server、MongoDB、HBase、Cassandra这七大数据库进行特性、优缺点及使用…...
element-ui plus 中 filter-method 函数多次触发问题解决
前情提要 点进这个文章的小伙伴,应该都是为了解决一个需求,把原本的前端过滤改为后端过滤,但是将filter-method修改为后端取数据后,发现其触发了很多次。博主也是在修改表格过滤时用到了这个坑,本篇文章为大家解决一下…...
基于【Lang Chain】构建智能问答系统的实战指南
🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Lang Chain 2、LangChain在问答系统中的核心优…...
idea的快捷键使用以及相关设置
文章目录 快捷键常用设置 快捷键 快捷键作用ctrlshift/注释选中内容Ctrl /注释一行/** Enter文档注释ALT SHIFT ↑, ALT SHIFT ↓上下移动当前代码Ctrl ALT L格式化代码Ctrl X删除所在行并复制该行Ctrl D复制当前行数据到下一行main/psvm快速生成入口程序soutSystem.o…...
TestHubo安装及入门指南
TestHubo是一款开源免费的测试管理工具,提供一站式测试解决方案,涵盖功能测试、接口测试、性能测试以及 Web 和 App 测试等多个维度。TestHubo 整合了全面的测试能力,使团队可以在一个平台内完成所有测试需求。本文将介绍如何快速安装配置及入…...
react tailwindcss最简单的开始
参考教程: Install Tailwind CSS with Vite - TailwindCSS中文文档 | TailwindCSS中文网https://www.tailwindcss.cn/docs/guides/vite操作过程: Microsoft Windows [版本 10.0.26100.3476] (c) Microsoft Corporation。保留所有权利。D:\gitee\tailwi…...
openGauss新特性 | 自动参数化执行计划缓存
目录 自动化参数执行计划缓存简介 SQL参数化及约束条件 一般常量参数化示例 总结 自动化参数执行计划缓存简介 执行计划缓存用于减少执行计划的生成次数。openGauss数据库会缓存之前生成的执行计划,以便在下次执行该SQL时直接使用,可…...
3、组件:魔法傀儡的诞生——React 19 组件化开发全解析
一、开篇:魔法傀儡的觉醒 "每个React组件都像一具魔法傀儡,"邓布利多校长挥动魔杖,空中浮现出闪烁的代码字符,"它们能自主思考、协同工作,甚至能跨越时空(服务器与客户端)执行任…...
使用Python实现矢量路径的压缩、解压与可视化
引言 在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要。本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,再将其解压还原,并通过matplotlib进行可视化。这一过程可应用于字体设计、矢量图…...
达梦数据库迁移问题总结
更多技术博客,请关注微信公众号:运维之美 问题一、DTS工具运行乱码 开启图形化 [rootlocalhost ~]# xhost #如果命令不存在执行sudo yum install xorg-x11-server-utils xhost: unable to open display "" [rootlocalhost ~]# su - dmd…...
OpenHarmony荷兰研习会回顾 | 仓颉语言赋能原生应用开发实践
近日,由全球顶级学术峰会EuroSys/ASPLOS和OpenHarmony社区在荷兰鹿特丹合办的操作系统深度研习会圆满收官,本次研习会以"架构探秘-开发实践-创新实验"三位一体的进阶模式,为全球开发者构建了沉浸式技术探索平台。其中,由…...
