32位和64位linux系统调用

时间:2014-09-04 20:29:38

标签: linux sandbox system-calls

我正在使用这个https://github.com/openjudge/sandbox项目来控制我在服务器上的程序执行。除了我无法理解示例代码的一部分如何工作之外,我几乎完成了所有工作。部分是:

int16_t abi32(int scno)
{
    assert((scno >= 0) && (scno < 1024));
#ifdef __x86_64__
    return (int16_t)(scno | (1 << 10));
#else /* __i386__ */
    return (int16_t)(scno);
#endif /* __x86_64__ */
}

...
const int16_t sc_safe[] =
{
    abi32(0), abi32(3), abi32(4), abi32(19), abi32(45), abi32(54),
    abi32(90), abi32(91), abi32(122), abi32(125), abi32(140), abi32(163),
    abi32(192), abi32(197), abi32(224), abi32(243), abi32(252),
#ifdef __x86_64__
    0, 1, 5, 8, 9, 10, 11, 12, 16, 25, 63, 158, 219, 231,
#endif /* __x86_64__ */
    -1, /* sentinel */
};

...

sc_safe数组是系统调用的白名单,因为它们在操作系统类型之间有所不同,所以有宏#ifdef x86_64 。但是为什么#else分支中没有32位系统调用,为什么它应该适用于64位操作系统,如果32位系统调用%eax增加1024?是否忽略了这种方式?

0 个答案:

没有答案