为什么要分两步进行位移?
在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 long32 位宽。在这种情况下,两个参数high和low组合在一起。
我想知道为什么代码移位两次而不是一次。在提交消息和 LWN 文章中有更多关于此代码的信息:系统调用和 64 位体系结构,但没有解释双位移位。