问题标签 [vdso]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
5553 浏览

linux - gettimeofday 系统调用如何工作?

gettimeofday根据this page是x86-86的系统调用(只需gettimeofday在框中搜索):

我认为反汇编应该很容易,只需准备两个指针并调用相关的syscall,但它的反汇编做得更多:

而且我根本看不到syscall

谁能解释它是如何工作的?

0 投票
1 回答
1220 浏览

linux - `[stack]`、`[vdso]` 和 `[vsyscall]` mmap 是从哪里来的?

考虑以下针对 Linux x86_64 的程序:

信息系统:

这基本上是一个无限循环。

如果我链接并剥离它,我会得到一个 ELF 可执行文件:

在 ELF 可执行文件中,第一个程序头LOAD包含占上述 mmap (a.out) 中第一个条目的映射。(即使我剥离了所有内容,但此标头和代码观察到相同的映射。) execve(2)调用 ELF 处理程序,在fs/binfmt_elf.c该处理程序中读取程序标头并在文件上调用 mmap。

我不明白的是其他三个来自哪里(堆栈,vdso,vsyscall)。ELF 文件中没有提到它们,因此 Linux 内核必须默认设置这三个“匿名”或“特殊”映射。

我的问题是 Linux 内核在内核代码中的什么位置(或如何)创建这三个映射?它们是跨 execve 继承的吗?我似乎看不到fs/exec.c它们是在哪里创建的。

0 投票
1 回答
1594 浏览

gcc - is it possible to turn off vdso on glibc side?

I am aware that passing vdso=0 to kernel can turn this feature off, and that the dynamic linker in glibc can automatic detect and use vdso feature from kernel.

Here I met with this problem. There is a RHEL 5.6 box (kernel 2.6.18-238.el5) in my institution where I only have a normal user access, probably suffering from RHEL bug 673616.

As I compile a toolchain of linux-headers-3.9/gcc-4.7.2/glibc-2.17/binutils-2.23 on top of it, gcc bootstrap fails in cc1 in stage2 cannnot be run

and a simple program

get segment fault in the same way if compiled against glibc-2.17 and xgcc from stage1.

Both cc1 and the test program can be run on another running RHEL 5.5 (kernel 2.6.18-194.26.1.el5) with gcc-4.7.2/glibc-2.17/binutils-2.23 as normal user.

I cannot simply upgrade the box to a newer RHEL version, nor could I turn VDSO off via sysctl or proc. The question is, is there a way to compile glibc so that it turns off VDSO unconditionally?

0 投票
2 回答
40473 浏览

c - 什么是 vdso 和 vsyscall?

我做了sudo cat /proc/1/maps -vv

我正在尝试理解输出。我可以看到许多共享库按预期映射到内存映射段。

到最后有类似的东西

是什么vdso意思vsyscall?vsyscall 是内存的内核部分吗?如果有人能对这个问题有所了解,那就太好了。

0 投票
0 回答
121 浏览

linux - 即时迁移 VDSO

我正在尝试从 RAM 转储中在我的程序中分配一个新的 VDSO。我在“Linux user1-vbox 3.2.0-55-generic-pae #85-Ubuntu SMP Wed Oct 2 14:03:15 UTC 2013 i686 i686 i386 GNU/Linux”上

问题是 :

  • 内存替换工作得很好
  • 通常调用 __kernel_vsyscall 的调用 *%gs:0x10 完全丢失

问题是每次我运行我的程序时,%gs 都是一样的(0x33),但是必须有一些东西一直告诉 proc“VDSO 在这里”,并且我想修改为“嘿,不,现在,VDSO 就在那里”。

我在 Google 上搜索了一下,发现 VDSO 地址在两个变量的帮助下保存在进程内存中:AT_SYSINFO 和 AT_SYSINFO_EHDR。两者都属于一个名为“auxv”的数组,该数组位于堆栈中 argc、argv 和 envp 之后。

但是即使我修改了这个值,我的进程仍然会找到一种方法来知道它的 VDSO 在哪里。有什么办法 ?

0 投票
1 回答
104 浏览

architecture - vDSO:为什么 linux 只将它们用于与时间相关的功能?

刚刚在 Linux 内核中搜索了 vdso 钩子(例如在 kernel.org 上找到了这个),它目前似乎主要用于与时间相关的系统调用。这让我想到了两个问题:

  • 是否有任何其他系统调用计划很快使用 vDSO 接口?
  • 是否clock_gettime()真的成为一个足够大的瓶颈来激发 vDSO 的设计?是否有任何特定类型的应用程序对此有所帮助?如果是这样,什么样的应用程序和多少?

为时间查找设计一个新的内核系统调用接口似乎很奇怪。我猜它可以帮助高性能服务器处理诸如时间戳请求响应和日志之类的事情。但我想知道这里是否有人有比猜测更具体的细节。

0 投票
0 回答
173 浏览

linux - Identifying Ifuncs in the VDSO

I see in the vdso that all functions are marked as STT_FUNC instead of STT_GNU_IFUNC. Especially I know "gettimeofday" is an Ifunc.

Is it true that all the functions in the VDSO are Ifuncs so they aren't tagged as such? if not - Why aren't these functions tagged as Ifuncs?

See the following on Ubuntu:

0 投票
1 回答
760 浏览

linux - 为什么在执行静态二进制文件时会出现 vdso?

这是一个快速示例程序。(这基本上会得到与进程关联的procmap )

静态准备

执行二进制

我在谷歌上搜索了 vDSO ,但没有正确理解。维基百科说“这些是可以从用户空间访问内核例程的方式”。我的问题是为什么这些共享对象会出现在静态二进制文件的执行中?

0 投票
0 回答
505 浏览

debugging - vsyscall 和 vdso 的调试信息

我正在使用 perf 工具来分析 centos 6.5(内核版本:2.6.32-431.el6.x86_64)上的内核模块。我已经单独安装了内核调试信息包。虽然我能够看到 [kernel.kallsyms] 函数的列表,但与 [vdso] 和 [vsyscall] 相关的符号无法识别并显示为十六进制数字。

任何想法如何添加这两个库的调试信息?

0 投票
1 回答
572 浏览

c - Linux 系统调用、libc、VDSO 和实现剖析

我剖析了最后一个 libc 中的系统调用调用:

我在 sysdeps/unix/sysv/linux/i386/sysdep.h 中有这段代码:

如果我很好理解这段代码,LOADREGS_##nr(args) 宏会将参数加载到寄存器 ebx、ecx、edx、esi、edx 和 ebp 中。

sysdeps/unix/sysv/linux/i386/sysdep.h

在寄存器 ebx、ecx、edx、esi、edx 和 ebp 中加载参数的代码在哪里?是上面这段代码吗?我不明白实现。下面的代码加载 ebx 寄存器中的第 6 个参数?

这段代码是什么:

它在 ebx 寄存器中加载第一个参数?

那么“call *%%gs:%P2”跳转到VDSO代码?此代码对应于“call *gs:0x10”?

那么,下图用于 write 系统调用,很好吗?:

我不了解 VDSO 实用程序!vdso 选择系统调用方法(sysenter 或 int 0x80)。

预先感谢您的帮助。对不起,我的英语很糟糕。