问题标签 [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 投票
0 回答
427 浏览

android - 给定 vDSO 的地址,如何在 vDSO 中查找符号地址?

我正在对 Dirty Cow 漏洞进行学校研究。在我的研究中,我发现了一些解决方案(例如这个),它们将一些 shellcode 注入到 vDSO(到函数中__vdso_clock_gettime)。

此解决方案及其所有衍生方案使用硬编码常量作为__vdso_clock_gettimevDSO 中符号的偏移量。然而,此常量并非对所有版本的内核和 vDSO 都有效(至少不适用于 Android 设备)。

有没有更好的方法在 C/C++ 中找到 vDSO 中符号的地址(偏移量)?我试过了

作为的[vdso]输出

vdso_addr找到了,/proc/self/auxv但我得到了dlopen failed: library "[vdso]" not found

我知道 vDSO 是一个系统问题,普通程序不应该决定是否从中调用函数,但是有没有一些通用的方法可以在 C/C++ 中找到符号的地址,而无需反汇编 vDSO 的每个可能版本并制作地址数据库?

在对 vDSO 的虚拟系统调用期间,系统如何获取符号地址?

0 投票
1 回答
331 浏览

linux - 如何在 Linux x86_64 系统上获取 VDSO 的大小

我想以一种我可以验证它是否正确的方式将 VDSO 转储到磁盘objdump -D

我们可以得到 VDSO 的基地址,getauxval(AT_SYSINFO_EHDR)vdso(7). 但是如何获得对象的大小呢?

我碰巧知道它正好有两页长,但我不确定我是否可以依赖它。

我在 ELF 标头中看不到任何可以指示整个对象大小的内容,而且我也尝试过迭代和转储这些部分dl_iterate_phdr(3),但并不高兴(大概这会跳过 ELF 标头?)。

有任何想法吗?我真的必须从 proc 映射中刮掉尺寸吗?

0 投票
1 回答
155 浏览

python - python如何在Linux中看似没有正常系统调用的情况下确定PID?

运行以下命令时

我注意到 strace 没有捕获对getpid(2) 系统调用的调用。我首先认为这是由于 glibc 缓存了 pid,但是如果没有至少一个真正的系统调用,就不应该有一个 pid 供 libc 缓存。然后我认为可能是 vdso 是罪魁祸首,但是运行一个通过 libc 进行此系统调用的 C 程序会getpid在跟踪时显示调用。终于放弃了,查了一下os.getpidpython模块的源码,貌似是定义在Modules/posixmodule.c. 令我惊讶的是(以及随后的困惑),它正常调用getpid!

所以我的问题是:python如何确定结果os.getpid?如果确实通过调用获得了这样的值getpid,那么该调用实际上是如何进行的?

0 投票
1 回答
306 浏览

linux - vdso32 和 vdsox32 有什么区别?

如果这个问题的答案显而易见,我深表歉意,但为什么在 linux 系统上有两个用于 32 位可执行文件的 vdso版本[1] ,以及用于选择它们的标准是什么?

* 可以在/lib/modules/KERNEL_NAME/vdso

0 投票
2 回答
618 浏览

c - Linux系统调用何时触发段错误与返回EFAULT?

我试图了解何时clock_gettime()会导致错误。手册页列出了以下两种可能性:

  1. EFAULT tp 指向可访问地址空间之外。
  2. EINVAL 此系统不支持指定的 clk_id。

很容易触发EINVAL错误,但我无法clock_gettime()设置errnoEFAULT. 相反,内核发送一个 SIGSEGV 信号来终止程序。例如,在以下代码中:

Linux 内核如何在触发分段错误和让系统调用返回之间做出选择-EINVAL?什么时候会选择做后者?如果内核总是发送信号,是否真的需要检查是否errno等于EFAULT

我正在运行 Linux 内核 4.15,并使用(使用 clang v6.0)编译了该程序: clang -g -O0 -Wall -Wextra -Wshadow -Wstrict-aliasing -ansi -pedantic -Werror -std=gnu11 file.c -o file

0 投票
1 回答
360 浏览

c - 有没有办法使用最新内核创建 vDSO?

我正在尝试使用最新的内核源代码进行 vDSO。我正在关注本教程https://www.linuxjournal.com/content/creating-vdso-colonels-other-chicken?page=0,0 但是我没有在 linux- 中找到一些函数,如 update_vsyscall() 和 vdso 目录4.20.13/arch/x86/vdso。我的问题是:有没有办法使用新的内核代码进行虚拟系统调用,例如 gettimeofday()?

0 投票
1 回答
35 浏览

linux - 将 ioport 形式的硬件映射到 vDSO 功能

我在 Linux 上使用 SAMA5d2 CPU,并希望能够从 vdso 功能访问 ioport。我应该如何将 ioport 映射到用户空间内存以访问从用户空间调用的 vdso 函数中的 ioport?实际上我想在 tcb_clksrc 定时器中实现定时器周期的获取。内核只有arch_arm_timer时钟源的实现,我想实现tcb_clksrc定时器在我的SAMA中使用它

0 投票
1 回答
97 浏览

c - 使用 __kernel_vsyscall 调用 write 系统调用不起作用

我写了一个示例程序__kernel_vsyscall用于系统调用

这个调用的代码exit(42)工作正常。

但是当我试图打电话时write(1, "hello world", 12),它失败了

它因分段错误而失败。

dmesg:

0 投票
0 回答
48 浏览

linux-kernel - 内核 VDSO 中的动态内存分配

对于一个实验,我需要arch/x86/vdso/vclock_gettime.c通过以下典型方法为内部哈希表检测和分配入口节点。

我已经在内核的其他区域进行了测试和使用,它可以按预期编译和工作。但是,在 VDSO 的情况下,它会导致链接失败

我知道 VDSO 有一个特殊的状态,虽然分配在内核空间中,但被映射到每个进程地址空间中的用户空间。

我想知道,是否有更有经验的人可以发现或建议在 vdso 中根据我的需要分配内存的方法。

PSmalloc不能使用,因为这需要stdlib.h导致链接glibc

0 投票
0 回答
175 浏览

linux - 为什么 x86_64 的 vdso 中没有实现 getpid()?

在 glibc 2.25 之后,glibc 的getpid()包装器不再缓存其结果。但是,在 x86_64 上,vdso 没有提供getpid()函数。这意味着每次调用getpid()时,都会触发一个系统调用。

我想知道为什么 x86_64 vdso 不提供getpid()函数(即使在内核 5.x 上)。