在Linux Kernel中以平台无关的方式设置或清除一点

时间:2016-10-11 20:52:47

标签: c linux-kernel

我目前正在阅读Robert Love的 Linux内核开发,第三版,我在一节解释set_bit(),{{1原子函数及其非原子兄弟clear_bit()__set_bit()

  

与原子整数运算不同,代码通常无法选择是否使用按位运算 - 它们是唯一可移植的方式来设置特定位。

-p。 183(强调我自己)

据我所知,这些操作可以在一个特定于平台的汇编指令中实现,这就是存在这些内联函数的原因。但我很好奇为什么作者说这些是唯一的便携式方法来做这些事情。例如,我相信我可以通过在普通C中执行此操作,在__clear_bit()中非原子地设置位nr

unsigned long x

同样地,我可以通过这样做非原子地清除x |= 1UL << nr; 中的位nr

unsigned long x

当然,根据编译器的复杂程度,这些可能会编译为多个指令,因此它们可能不如x &= ~(1UL << nr); __set_bit()函数那么好。

我在这里遗漏了什么吗?这个短语只是一个有点懒惰的简化,还是有一些关于我上面提到的设置和清除位的方式无法解释?

编辑:看来,尽管GCC相当复杂,但它仍然执行位移,而不是使用像__clear_bit()函数那样的单指令,即使在{{1}上也是如此}(版本6.2.1)。举个例子:

__set_bit()

1 个答案:

答案 0 :(得分:1)

atomic 整数运算的上下文中,“按位运算”也表示原子运算。

非原子按位操作没有什么特别之处(除了它们支持大于BITS_PER_LONG的数字),因此generic implementation始终是正确的,并且仅需要特定于体系结构的实现来优化性能。 / p>