为什么系统调用 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?
实际阅读内核源代码 - 大多数(所有?)系统调用都在一个地方。
和
您可以在树或体系结构子树中 grep SYSCALL_DEFINE
。
我注意到我的程序在 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?
实际阅读内核源代码 - 大多数(所有?)系统调用都在一个地方。
和
您可以在树或体系结构子树中 grep SYSCALL_DEFINE
。