在Linux 内核中,我找到了以下代码:
static inline loff_t pos_from_hilo(unsigned long high, unsigned long low)
{
#define HALF_LONG_BITS (BITS_PER_LONG / 2)
return (((loff_t)high << HALF_LONG_BITS) << HALF_LONG_BITS) | low;
}
该代码用于将系统调用参数组合成一个更广泛的变量,例如在 ia32 上,偏移量pwritev
在两个 32 位寄存器中指定。
在 x64 上,loff_t
并且unsigned long
都是 64 位宽。在这种情况下,该high
变量被忽略并且仅low
被使用。在 ia32 上,loff_t
是 64 位宽和unsigned long
32 位宽。在这种情况下,两个参数high
和low
结合在一起。
我想知道为什么代码位移两次而不是一次。在提交消息和 LWN 文章中有更多关于此代码的信息:系统调用和 64 位架构,但没有对双位移位的解释。