为什么要分两步进行位移?

在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 位宽。在这种情况下,两个参数highlow组合在一起。

我想知道为什么代码移位两次而不是一次。在提交消息和 LWN 文章中有更多关于此代码的信息:系统调用和 64 位体系结构,但没有解释双位移位。

以上是为什么要分两步进行位移?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>