#syscalls #linux #directasm

syscall-linux-raw

定义用于执行原始 Linux 系统调用的 syscallN 方法

1 个不稳定版本

0.0.2 2021 年 3 月 2 日
0.0.1 2020 年 7 月 2 日

#893 in Unix API

Download history 118/week @ 2024-03-13 54/week @ 2024-03-20 55/week @ 2024-03-27 96/week @ 2024-04-03 105/week @ 2024-04-10 119/week @ 2024-04-17 67/week @ 2024-04-24 80/week @ 2024-05-01 121/week @ 2024-05-08 92/week @ 2024-05-15 136/week @ 2024-05-22 107/week @ 2024-05-29 151/week @ 2024-06-05 111/week @ 2024-06-12 115/week @ 2024-06-19 101/week @ 2024-06-26

505 下载/月

无版权许可证

10KB
131

syscall-linux-raw

定义用于执行原始 Linux 系统调用的 syscallN 方法。

是什么

定义了一组方法,用于抽象具有不同数量参数的原始系统调用,仅在 target_os = "linux" 上可用。就是这样。但它可以在稳定版本上工作,并且可能对其他系统调用二进制接口有所启发。

如何

通过纯粹的魔法。开玩笑的,它定义了一个完全汇编的二进制函数,具有正确的 C-abi,并将它们作为可调用的函数使用 #[no_mangle] 标记,然后定义了一组使用 Rust abi 的包装器,这些包装器在某些时候应该是独立于后端选择的 ISA 可用的。

什么意思

的确。不要在生产环境中使用。

演示?

请参阅示例:cargo run --example simple.

仅在 x86_64-unknown-linux-* 上运行,并在其他架构和操作系统上编译失败。

许可证

基本软件: 无版权许可证


lib.rs:

可能支持的平台表

系统调用和 ret 指令及寄存器

Arch/ABI    Instruction           System# Ret1  Ret2
arm/OABI    swi NR                -       r0    -
arm/EABI    swi 0x0               r7      r0   r1
arm64       svc #0                w8      x0   x1
i386        int $0x80             eax     eax  edx
riscv       ecall                 a7      a0   a1
x86-64      syscall               rax     rax  rdx
x32         syscall               rax     rax  rdx

参数寄存器

Arch/ABI      arg1  arg2  arg3  arg4  arg5  arg6  arg7  Notes
arm/OABI      r0    r1    r2    r3    r4    r5    r6
arm/EABI      r0    r1    r2    r3    r4    r5    r6
arm64         x0    x1    x2    x3    x4    x5    -
i386          ebx   ecx   edx   esi   edi   ebp   -
riscv         a0    a1    a2    a3    a4    a5    -
x86-64        rdi   rsi   rdx   r10   r8    r9    -
x32           rdi   rsi   rdx   r10   r8    r9    -

C-abi 寄存器

Arch/ABI      a0    a1    a2    a3    a4    a5    ret1  ret2  caller
x86-64        rdi   rsi   rdx   rcx   r8    r9    rax   rdx   rbx,rsp,rbp

依赖项

~2MB
~44K SLoC