x86中vdso数据段的初始化及更新和使用

2023-11-06

1、vdso 数据段的初始化
1)数据段的定义:
vdso 数据段由内核进行声明和定义,其中,在链接脚本 arch/x86/entry/vdso/vdso-layout.lds.S 里指定了 vdso 的数据段的名称和位置,相关内容如下:

SECTIONS {
    vvar_start = . - 3 * PAGE_SIZE;
    vvar_page = vvar_start;

    #define EMIT_VVAR(name, offset) vvar_ ## name = vvar_page + offset;
    #define __VVAR_KERNEL_LDS
    #include <asm/vvar.h>
    #undef __VVAR_KERNEL_LDS
    #undef EMIT_VVAR

    ...
}

其中 <asm/vvar.h> (arch/x86/include/asm/vvar.h)里的相关内容是:

#define DECLARE_VVAR(offset, type, name) EMIT_VVAR(name, offset)

DECLARE_VVAR(128, struct vsyscall_gtod_data, vsyscall_gtod_data)

结合上面的链接脚本可知,上述 #include <asm/vvar.h> 的结果是在 vdso 中定义了一个 vvar_vsyscall_gtod_data 符号,它的起始地址是 vvar_page + 128。


2)与之关联的变量定义:
在 ./arch/x86/entry/vsyscall/vsyscall_gtod.c 文件中有这样一条语句:

DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data);

这个 DEFINE_VVAR 宏同样定义在 <asm/vvar.h> 文件中:

#define DEFINE_VVAR(type, name) type name __attribute__((section(".vvar_" #name), aligned(16))) __visible

因此,上述宏调用的结果是定义了一个 struct vsyscall_gtod_data vsyscall_gtod_data 变量,它位于 vdso 的 .vvar_vsyscall_gtod_data段。

至此,struct vsyscall_gtod_data vsyscall_gtod_data 变量与 vdso 中数据段的关系已经建立起来了。

2、vdso数据段的更新
vdso 数据段的内容由内核在 ./arch/x86/entry/vsyscall/vsyscall_gtod.c 文件中进行更新。
主要涉及两个函数:update_vsyscall_tz() 和 update_vsyscall() 。
实现如下,这里的 vsyscall_gtod_data 就是上面定义的 vsyscall_gtod_data 变量:

void update_vsyscall_tz(void)
{
    vsyscall_gtod_data.tz_minuteswest = sys_tz.tz_minuteswest;
    vsyscall_gtod_data.tz_dsttime = sys_tz.tz_dsttime;
}
void update_vsyscall(struct timekeeper *tk)
{
    int vclock_mode = tk->tkr_mono.clock->archdata.vclock_mode;
    struct vsyscall_gtod_data *vdata = &vsyscall_gtod_data;

    /* copy vsyscall data */
    vdata->vclock_mode = vclock_mode;
    ...
}


3、vdso数据段的使用
vdso 数据段的内容由用户态的 __vdso_xxxx() 等函数使用。
例如,在文件 arch/x86/entry/vdso/vclock_gettime.c 中定义的 __vdso_gettimeofday() 函数:


notrace int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
{
    if (likely(tv != NULL)) {
        if (unlikely(do_realtime((struct timespec *)tv) == VCLOCK_NONE))
            return vdso_fallback_gtod(tv, tz);
        tv->tv_usec /= 1000;
    }
    if (unlikely(tz != NULL)) {
        tz->tz_minuteswest = gtod->tz_minuteswest;
        tz->tz_dsttime = gtod->tz_dsttime;
    }
    return 0;
}

其中 gtod 的定义是:

#define gtod (&VVAR(vsyscall_gtod_data))

其中 VVAR() 宏的定义是

#define VVAR(name) (vvar_ ## name)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x86中vdso数据段的初始化及更新和使用 的相关文章

  • linux fdisk的分区和格式化和挂载相关操作说明

    注意 分区的时候要umount磁盘之后才能分区 在Ubuntu用fdisk分析需要root用户权限 第一步 先把设备卸载掉 解除占用 caizd ubuntu home share lsblk 查看大小空间 caizd ubuntu hom
  • 输入英文有空格 解决方法

    shift 空格 直接搞定
  • linux常用命令总结

    linux常用命令总结 1 在根目录下查找xxx文件 2 列出程序启动时搜索库路径的过程 3 查看程序或so的依赖 1 查看Test程序依赖的so文件 2 也可以查看so依赖的文件 4 SSH相关 5 查看当前登录的用户 6 查看重启 登录
  • openEuler 20.03 LTS SP2以及SP3安装完gnome后,gdm登陆进入不了桌面问题

    一 问题原因 是由于CVE 2020 17489相关补丁引入的 暂不清楚是何原因造成 但除去该相关补丁之后 该问题消失 在网上查了下 CVE 2020 17489的问题是gnome shell的某些配置中会发现 注销账户时 登陆对话框中的密
  • gdb如何调试动态链接库

    gdb file
  • Googletest 实现简要分析

    借助于 Googletest 测试框架 我们只需编写测试用例代码 并定义简单的 main 函数 编译之后并运行即可以把我们的测试用例跑起来 更详细的内容可参考 Googletest 入门 但 main 函数调用 RUN ALL TESTS
  • Ubuntu搭建Qt环境

    1 ubuntu搭建qt环境的好处 ubuntu上可以安装qtcrater 然后一键下载到板子上 不需要手动编译 2 安装linux版本的qtcreater 注意 必须要先安装g 再安装qtcreater 否则会出问题 下载g 编译器 su
  • SIGPIPE的设计意图

    SIGPIPE的设计意图 SIGPIPE 是为以下这种情况设计的 grep pattern lt reallyhugefile head grep可能会输出成千上万行文本 但 head 只会读取前10行然后就退出 一旦head退出 grep
  • x86中vdso数据段的初始化及更新和使用

    1 vdso 数据段的初始化 1 数据段的定义 vdso 数据段由内核进行声明和定义 其中 在链接脚本 arch x86 entry vdso vdso layout lds S 里指定了 vdso 的数据段的名称和位置 相关内容如下 SE
  • BlueZ5.45 D-Bus总线 GATT API 分析

    笔者目前做linux系统下bluez蓝牙项目开发 发现网上关于bluez开发的资料很少 对于刚开始接触bluez蓝牙的开发人员来说是非常痛苦的 通过调试bluez源码自带的应用例子和文档说明 对BlueZ5 45 D Bus总线 GATT
  • 解决python安装模块时的“No module named setuptools“报错问题

    在利用python安装模块时利用python setup py install语句执行时 出现一下报错问题 简单来讲 该问题出现的原因就是 python默认是没有安装setuptools这个模块的 这也是一个第三方模块 所以在利用setup
  • 网络编程之三

    代码1 chat tcp client1 c include header h int main int argc char argv int connfd 1 if 0 gt connfd socket AF INET SOCK STRE
  • Linux下的时间(ZZ)

    1 Linux下的时间 1 1 Linux下的时间系统 1 2 Linux下与时间有关的数据结构 2 获得当前时间 3 延时 4 定时器 4 1 alarm 4 2 setitimer 1 Linux下的时间1 1 Linux下的时间系统
  • valgrind 在开发板上运行以及使用

    前言 bedug无处不在 今天花落我家 现象 一个月出现一次异常 难易复现排查 借助神器valgrind排查 1 下载及编译准备 下载地址 https www valgrind org tar jxvf valgrind 3 16 1 ta
  • Linux的c编程-文件节点的打开与读写操作

    1 open 打开文件 相关函数 read write fcntl close link stat umask unlink fopen 表头文件 include
  • Shell:查看进程与对应的线程

    1 通过 ps efL grep 进程ID或名字 UID PID PPID LWP C NLWP STIME TTY TIME CMD user 228298 201990 228298 0 2 00 14 pts 0 00 00 00 t
  • Linux学习笔记(九) -- 利用Code::Blocks建立C++静态链接库

    1 测试平台 测试平台 Linux版本 Ubuntu 18 04 LTS Code Blocks版本 16 01 2 操作步骤 2 1 启动Code Blocks 2 2 新建静态链接库工程 1 选择 File 菜单中的 New Proje
  • Ubuntu下安装和注册beyond compare 4

    下载 安装 下载安装包网址 Ubuntu上选择Debian安装包 https www scootersoftware com download php sudo dpkg i bcompare 4 4 6 27483 amd64 deb 注
  • GDB and Reverse Debugging

    Overview GDB version 7 0 due September 2009 will be the first public release of gdb to support reverse debugging the abi
  • mysql 修改执行delect/update时报错(安全模式)

    MySql运行在safe updates模式下 会导致非主键条件下无法执行update或者delete命令 解决方法 执行命令 关闭安全模式 SET SQL SAFE UPDATES 0 数据处理之后 最好恢复安全模式 SET SQL SA

随机推荐

  • 基于Python+Pyecharts+爬虫实现的对全球疫情新增患者可视化分析

    文章目录 前言 1 爬取网站获取全球各国新冠新增人数 1 1挑选网站进行网页源码分析 1 2对该网站采用requests库进行网络爬取 1 3将返回的字典添加到刚才所建立的空列表当中 2 对所得数据进行可视化分析 2 1采用pyechart
  • Grafana

    为什么80 的码农都做不了架构师 gt gt gt 最近在调研InfluxDB的时候接触到了Grafana Grafana是什么 一个类似Kibana的东西 也是对后端的数据进行实时展示 那么Grafana和Kibana有什么区别 在我看来
  • tp5中树状图数据格式的返回

    1 条件 数据库中的数据必须是无限递归数据 2 数据处理 public function treeListApi list this gt db class gt field id name parent id gt where is de
  • str功能的实现

    1 strcat 功能 把src所指字符串添加到dest结尾处 覆盖dest结尾处的 0 并添加 0 程序 char strcat char dest const char src char addr dest int i 0 j 0 as
  • 私服的搭建

    私服 基于nexus 3 20 1 下载地址 https help sonatype com repomanager3 download 目前该下载地址国内下载根本下载不了 你可以去百度找找看 分享一个百度网盘下载链接 链接 https p
  • Oracle 索引

    1 索引介绍 索引是用于加速数据存取的数据对象 是对数据表中一个或多个列进行排序的结构 合理的使用索引可以大大降低I O次数 从而提高数据访问性能 2 问题 为什么需要索引 Select from scott emp where empno
  • python(五)函数、模块、包

    模块 包的概念 在Python中 一个 py文件就称之为一个模块 Module 我们在编写程序的时候 也经常引用其他模块 包括Python内置的模块和来自第三方的模块 你也许还想到 如果不同的人编写的模块名相同怎么办 为了避免模块名冲突 P
  • oracle多个表count值求和

    union和union all关键字都是将两个结果集合并为一个 但这两者从使用和效率上来说都有所不同 union在进行表链接后会筛选掉重复的记录 所以在表链接后会对所产生的结果集进行排序运算 删除重复的记录再返回结果 而union all只
  • docker安装fastDFS

    一 docker安装 1 搜索镜像 2 拉取镜像 最新版本 docker pull delron fastdfs 3 使用镜像构建容器 3 1 创建tracker容器 docker run dti network host name my
  • js-yaml简单使用

    安装 js yaml npm install js yaml index js let fs require fs let content fs readFileSync text yaml encoding utf8 let yaml r
  • img加载图片的三种方式

    方式一 src指向图像的位置 最常用的一种方式 无需搭配后端代码 img src img boat gif alt Big Boat 方式二 src执行后台路径 获取图片的字节数组 前端代码 img src getImage alt Big
  • ubuntu20.04网络配置

    安装net tools sudo apt get install net tools 2 ifconfig查看网卡设备 其中flags表中 running表示正在使用中 查看设备核心网络路由表 route n Destination 目标网
  • 将AWS S3大文件文件上传相关的API集成为js文件,功能包括 多文件并行上传、文件分片上传、断点续传、文件分片合成、上传暂停、取消上传、文件上传进度条显示

    地址 https github com gk 1213 easy s3 tree main 效果 直接运行vue example文件就行 easy s3 将AWS S3大文件文件上传相关的API集成为js文件 功能包括多文件并行上传 文件分
  • 【C-函数】scanf函数原理

    文章目录 1 行缓冲 2 scanf原理 3 scanf案例 1 代码 2 结果 1 行缓冲 行缓冲的意思就是我们输入的字符放入缓冲区 直到输入了回车键进行换行才进行 I O 操作 2 scanf原理 在C中的标准输入函数scanf 使用的
  • Xilinx FPGA PCIe XDMA性能测试报告(二)

    1 测试内容 本报告对Xilinx FPGA的PCIe XDMA结合DDR4 SDRAM缓存的性能进行了测试 同时 给出了具体的测试框图 测试平台 测试步骤 测试记录等内容 2 测试框图 3 测试平台 硬件平台 Dell R330 Inte
  • 求解汉诺塔问题(提示, 使用递归)

    汉诺塔问题是一个经典的问题 汉诺塔 Hanoi Tower 又称河内塔 源于印度一个古老传说 大梵天创造世界的时候做了三根金刚石柱子 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另
  • IDEA Unescaped xml character报错的解决办法

    File Settings里边 选择Editor Inspections 并在右边找到HTML下的Malformed content of
  • 对Verilog 初学者比较有用的整理(转自它处)

    作者 Ian11122840 时间 2010 9 27 09 04 标题 菜鸟做设计必看 有关如何
  • JAVA中容器的概念

    解释一 容器 Container Spring 提供容器功能 容器可以管理对象的生命周期 对象与对象之间的依赖关系 您可以使用一个配置文件 通常是XML 在上面定义好对象的名称 如何产生 Prototype 方式或Singleton 方式
  • x86中vdso数据段的初始化及更新和使用

    1 vdso 数据段的初始化 1 数据段的定义 vdso 数据段由内核进行声明和定义 其中 在链接脚本 arch x86 entry vdso vdso layout lds S 里指定了 vdso 的数据段的名称和位置 相关内容如下 SE