gpt4 book ai didi

linux - 如何利用您自己的编程语言使用 VDSO 对象?

转载 作者:IT王子 更新时间:2023-10-29 00:17:31 27 4
gpt4 key购买 nike

最近的 Linux 内核(至少在 amd64 上)提供了一个名为 linux-vdso.so.1 的神奇对象文件,它抽象出内核的系统调用接口(interface),允许内核选择最佳调用惯例。如果您用 C 语言编写代码,glibc 会自动使用此对象。

现在,如果我想在不使用 glibc 的情况下编写程序,我该如何使用这个对象?它提供的接口(interface)是否记录在某处?调用约定呢?

最佳答案

这取决于您的实现是否为低级实用程序使用 C 接口(interface)。

如果您的语言实现无需通过 C 包装器即可直接访问系统调用,则您不需要使用 VDSO(例如,您可以生成适当的 SYSENTER 机器指令来执行系统调用),但您可以决定使用 VDSO,然后利用它。在那种情况下,您的语言甚至不需要遵循所有 ABI 约定,只需遵循内核的约定。 (例如,您不需要 ABI 在寄存器上提供调用者安全的 calle-safe distinguo,您甚至可以避免使用任何堆栈)。

甚至不使用 libc.so 的语言实现示例是Bones Scheme .您可以找到其他几个。

我对 VDSO 的理解是,它是内核提供的一种抽象,用于抽象出各种 x86 处理器系列之间在实现系统调用时的各种小差异(与用户空间 -> 内核转换相关)。如果您选择了特定的处理器目标,则不需要 VDSO,而且您始终可以避免使用它。

AFAIU,VDSO 是一个 ELF 共享对象,位于(在我的 Debian/AMD64 上,最近编译了 3.8.3 内核)在 ffffffffff600000-ffffffffff601000 段中;与 cat /proc/self/maps 准确核对在哪儿)。因此,您只需要了解 ELF 共享对象的组织并从中检索符号即可。参见 this & that链接。 VDSO 使用 x86-64 ABI 规范中记录的 C 约定进行调用。

也就是说,如果您从进程空间中提取 VDSO 并将其写入磁盘文件,结果是一个格式正确的 ELF 共享对象

ELF是一种有据可查的格式。 x86-64 ABI conventions也是如此 (它精确地定义了 C 调用约定,以及进程镜像的启动方式。另请参见 execve(2))手册页,当然还有内核文档,所以我不明白您的问题是什么。我同意理解 ELF 需要时间(我在 10 年前就做过,但我的内存已经生锈了)。另请阅读 <elf.h>机器上的头文件。

例如;正在运行(在 64 位 Debian x86-64 上的 zsh 下)

 % file $(which sash)
/bin/sash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
statically linked, for GNU/Linux 2.6.26,
BuildID[sha1]=0x0347fcc08fba2f811f58af99f26111d0f579a9f6, stripped

% ldd $(which sash)
not a dynamic executable

% sash
Stand-alone shell (version 3.7)
> ps |grep sash
21635 pts/3 00:00:00 sash
> cat /proc/21635/maps
00400000-004da000 r-xp 00000000 08:01 4985590 /bin/sash
006da000-006dc000 rw-p 000da000 08:01 4985590 /bin/sash
006dc000-006e1000 rw-p 00000000 00:00 0
017e3000-01806000 rw-p 00000000 00:00 0 [heap]
7fe4950e5000-7fe4950e7000 rw-p 00000000 00:00 0
7fff3f130000-7fff3f151000 rw-p 00000000 00:00 0 [stack]
7fff3f173000-7fff3f175000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

另见 this answer .

您可能希望在运行时中有一个能够简单解析 VDSO 的动态链接器的最小版本。您当然想了解进程启动时的确切状态,尤其是 auxv 的作用。 ,辅助向量(我真的忘记了这些细节,但我记得它们很重要)。参见例如this article

实际上,可靠地启动您的运行时可能比 VDSO 问题更难。

您可能还想阅读 linux assembly howto这也解释了一些事情(但更多关于 x86 而不是 x86-64)

顺便说一句,http://musl-libc.org/的代码(这是一个替代的 libc)更容易阅读和理解(你会很容易地了解它们如何进行动态链接、pthreads 等。)

关于linux - 如何利用您自己的编程语言使用 VDSO 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15602773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com