为什么系统调用 pread64 参数在 i386 和 arm/EABI 之间不同?

why system call pread64 parameter differs between i386 and arm/EABI?

我注意到我的程序在 i386 和 arm/EABI 之间的行为不同我 运行 它与 strace 并看到 pread64 参数在 arm/EABI.

上不正确

我 运行 使用 gdb 编程并查看 catch syscall pread64 info registers 并没有发现任何错误。

我强制系统调用参数然后注意到第四个参数实际上并没有改变 strace 中的任何东西。更改参数 order/usage 适用于特定架构。

long syscall6_i386(long nr, long p0, long p1, long p2, long p3, long p4, long p5){
    register long _r __asm__("eax");
    register long _p0 __asm__("ebx") = p0;
    register long _p1 __asm__("ecx") = p1;
    register long _p2 __asm__("edx") = p2;
    register long _p3 __asm__("esi") = p3;
    register long _p4 __asm__("edi") = p4;
    register long _p5 __asm__("ebp") = p5;
    __asm__ __volatile__(
        "int [=11=]x80"
        : "=r" (_r)
        : "0" (nr), "r" (_p0), "r" (_p1), "r" (_p2), "r" (_p3), "r" (_p4), "r" (_p5)
        : "memory"
    );
    return _r;
}

long syscall6_armeabi(long nr, long p0, long p1, long p2, long p3, long p4, long p5){
    register long _nr __asm__("r7") = nr;
    register long _r __asm__("r0"); /* also p0 */
    register long _p1 __asm__("r1") = p1;
    register long _p2 __asm__("r2") = p2;
    register long _p3 __asm__("r3") = p3;
    register long _p4 __asm__("r4") = p4;
    register long _p5 __asm__("r5") = p5;
    __asm__ __volatile__(
        "swi 0x0"
        : "=r" (_r)
        : "0" (p0), "r" (_nr), "r" (_p1), "r" (_p2), "r" (_p3), "r" (_p4), "r" (_p5)
        : "memory"
    );
    return _r;
}

那个 syscall6 函数的正确用法是

syscall6_i386(__NR_pread64, fd, data, size, off, off >> 32, /* not used */);
syscall6_armeabi(__NR_pread64, fd, data, size, /* not used */, off, off >> 32);

我在哪里可以找到其他没有暴力破解的系统调用的正确参数order/usage?

where i can find right parameter order/usage for other system calls without bruteforce?

实际阅读内核源代码 - 大多数(所有?)系统调用都在一个地方。

https://github.com/torvalds/linux/blob/4da9af0014b51c8b015ed8c622440ef28912efe6/arch/x86/kernel/sys_ia32.c#L68

https://github.com/torvalds/linux/blob/fcadab740480e0e0e9fa9bd272acd409884d431a/arch/arm64/kernel/sys32.c#L75

您可以在树或体系结构子树中 grep SYSCALL_DEFINE