问题标签 [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.
android - 给定 vDSO 的地址,如何在 vDSO 中查找符号地址?
我正在对 Dirty Cow 漏洞进行学校研究。在我的研究中,我发现了一些解决方案(例如这个),它们将一些 shellcode 注入到 vDSO(到函数中__vdso_clock_gettime
)。
此解决方案及其所有衍生方案使用硬编码常量作为__vdso_clock_gettime
vDSO 中符号的偏移量。然而,此常量并非对所有版本的内核和 vDSO 都有效(至少不适用于 Android 设备)。
有没有更好的方法在 C/C++ 中找到 vDSO 中符号的地址(偏移量)?我试过了
作为的[vdso]
输出
vdso_addr
找到了,/proc/self/auxv
但我得到了dlopen failed: library "[vdso]" not found
。
我知道 vDSO 是一个系统问题,普通程序不应该决定是否从中调用函数,但是有没有一些通用的方法可以在 C/C++ 中找到符号的地址,而无需反汇编 vDSO 的每个可能版本并制作地址数据库?
在对 vDSO 的虚拟系统调用期间,系统如何获取符号地址?
linux - 如何在 Linux x86_64 系统上获取 VDSO 的大小
我想以一种我可以验证它是否正确的方式将 VDSO 转储到磁盘objdump -D
。
我们可以得到 VDSO 的基地址,getauxval(AT_SYSINFO_EHDR)
如vdso(7)
. 但是如何获得对象的大小呢?
我碰巧知道它正好有两页长,但我不确定我是否可以依赖它。
我在 ELF 标头中看不到任何可以指示整个对象大小的内容,而且我也尝试过迭代和转储这些部分dl_iterate_phdr(3)
,但并不高兴(大概这会跳过 ELF 标头?)。
有任何想法吗?我真的必须从 proc 映射中刮掉尺寸吗?
python - python如何在Linux中看似没有正常系统调用的情况下确定PID?
运行以下命令时
我注意到 strace 没有捕获对getpid
(2) 系统调用的调用。我首先认为这是由于 glibc 缓存了 pid,但是如果没有至少一个真正的系统调用,就不应该有一个 pid 供 libc 缓存。然后我认为可能是 vdso 是罪魁祸首,但是运行一个通过 libc 进行此系统调用的 C 程序会getpid
在跟踪时显示调用。终于放弃了,查了一下os.getpid
python模块的源码,貌似是定义在Modules/posixmodule.c
. 令我惊讶的是(以及随后的困惑),它正常调用getpid
!
所以我的问题是:python如何确定结果os.getpid
?如果确实通过调用获得了这样的值getpid
,那么该调用实际上是如何进行的?
linux - vdso32 和 vdsox32 有什么区别?
如果这个问题的答案显而易见,我深表歉意,但为什么在 linux 系统上有两个用于 32 位可执行文件的 vdso版本[1] ,以及用于选择它们的标准是什么?
* 可以在/lib/modules/KERNEL_NAME/vdso
c - Linux系统调用何时触发段错误与返回EFAULT?
我试图了解何时clock_gettime()
会导致错误。手册页列出了以下两种可能性:
- EFAULT tp 指向可访问地址空间之外。
- EINVAL 此系统不支持指定的 clk_id。
很容易触发EINVAL
错误,但我无法clock_gettime()
设置errno
为EFAULT
. 相反,内核发送一个 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
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()?
linux - 将 ioport 形式的硬件映射到 vDSO 功能
我在 Linux 上使用 SAMA5d2 CPU,并希望能够从 vdso 功能访问 ioport。我应该如何将 ioport 映射到用户空间内存以访问从用户空间调用的 vdso 函数中的 ioport?实际上我想在 tcb_clksrc 定时器中实现定时器周期的获取。内核只有arch_arm_timer时钟源的实现,我想实现tcb_clksrc定时器在我的SAMA中使用它
c - 使用 __kernel_vsyscall 调用 write 系统调用不起作用
我写了一个示例程序__kernel_vsyscall
用于系统调用
这个调用的代码exit(42)
工作正常。
但是当我试图打电话时write(1, "hello world", 12)
,它失败了
它因分段错误而失败。
dmesg:
linux-kernel - 内核 VDSO 中的动态内存分配
对于一个实验,我需要arch/x86/vdso/vclock_gettime.c
通过以下典型方法为内部哈希表检测和分配入口节点。
我已经在内核的其他区域进行了测试和使用,它可以按预期编译和工作。但是,在 VDSO 的情况下,它会导致链接失败
我知道 VDSO 有一个特殊的状态,虽然分配在内核空间中,但被映射到每个进程地址空间中的用户空间。
我想知道,是否有更有经验的人可以发现或建议在 vdso 中根据我的需要分配内存的方法。
PSmalloc
不能使用,因为这需要stdlib.h
导致链接glibc
linux - 为什么 x86_64 的 vdso 中没有实现 getpid()?
在 glibc 2.25 之后,glibc 的getpid()包装器不再缓存其结果。但是,在 x86_64 上,vdso 没有提供getpid()函数。这意味着每次调用getpid()时,都会触发一个系统调用。
我想知道为什么 x86_64 vdso 不提供getpid()函数(即使在内核 5.x 上)。