1

我有这个程序,我需要使用 bitops.h 文件中的 test_and_set_bit 函数进行一些位操作。如何#include<linux/bitops.h>在我的文件中包含此C文件。即使我可以在内核源代码中找到它,它似乎也没有找到它。

是不是因为不允许包含在用户空间程序中。建议?

我正在使用#include<linux/bitops.h>然后使用gcc myfile.c.

它没有显示 bitops.h 文件的此类文件或目录。我可以在内核目录下找到它

4

3 回答 3

3

小心bitops.h。它可以从明确定义的来源产生未定义的行为。

例如,对于C/C++ 语言(参见第 5.8 节),移位不能为负数,不能等于单词的长度,也不能超过单词的长度。这意味着 32 位值只能移动 [0,31](含)。

在上面的例子中,除了 [0,31] 之外的任何东西都是“未定义的”。我相信编译器可以自由地为未定义的代码做它想做的事情,包括删除有问题的代码、调用abort()或到处乱扔垃圾。

许多程序滥用轮换和轮换。测试/检查的一个好方法是使用 John Regehr 和 Peng Li 的Integer Overflow Checker (IOC)。使用功能 ( ) 构建 Clang 很容易-fcatch-undefined-ansic-behavior,因此可以使用工具来检查这些东西。

话虽如此,下面是来自 3.8 内核的代码<linux\bitops.h>(2013 年 2 月 19 日下载)。如果程序员发送0(legal) 的移位大小,<linux\bitops.h>将由于(word << (32 - shift))(et al) 而创建非法代码。

当我在内核邮件列表中指出它时,我被告知“内核不会尝试完全符合标准”。内核的部分问题似乎是 Torvalds 和他的“GCC 是垃圾”的态度——他太笨了,不能正确地做事并使用静态分析等工具,他的一些开发人员也有同样的傲慢。

/**
 * rol64 - rotate a 64-bit value left
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u64 rol64(__u64 word, unsigned int shift)
{
    return (word << shift) | (word >> (64 - shift));
}

/**
 * ror64 - rotate a 64-bit value right
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u64 ror64(__u64 word, unsigned int shift)
{
    return (word >> shift) | (word << (64 - shift));
}

/**
 * rol32 - rotate a 32-bit value left
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u32 rol32(__u32 word, unsigned int shift)
{
    return (word << shift) | (word >> (32 - shift));
}

/**
 * ror32 - rotate a 32-bit value right
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u32 ror32(__u32 word, unsigned int shift)
{
    return (word >> shift) | (word << (32 - shift));
}

/**
 * rol16 - rotate a 16-bit value left
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u16 rol16(__u16 word, unsigned int shift)
{
    return (word << shift) | (word >> (16 - shift));
}

/**
 * ror16 - rotate a 16-bit value right
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u16 ror16(__u16 word, unsigned int shift)
{
    return (word >> shift) | (word << (16 - shift));
}

/**
 * rol8 - rotate an 8-bit value left
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u8 rol8(__u8 word, unsigned int shift)
{
    return (word << shift) | (word >> (8 - shift));
}

/**
 * ror8 - rotate an 8-bit value right
 * @word: value to rotate
 * @shift: bits to roll
 */
static inline __u8 ror8(__u8 word, unsigned int shift)
{
    return (word >> shift) | (word << (8 - shift));
}
于 2013-02-20T14:16:36.383 回答
1

建议你#include<linux/bitops.h>改成#include <asm/bitops.h>.

如果问题仍然存在,您必须使用gcc myfile.cpp -I"your linux directory"来判断gcc您的内核文件在哪里。

于 2012-09-23T18:07:52.903 回答
0

我尝试使用搜索路径包含来自/usr/src/linux-headers-$(uname -r)(在内核构建期间安装)的各种内核头文件,但都需要一个或多个其他内核头文件。-I kernel_header_path看起来./include/linux/bitops.h是所有特定于架构的位操作的建议包含文件。

所以,我同意@nos:使用内核代码进行用户空间位旋转并不容易。但是,arch/../include/asm/bitops.h中的特定于拱门的汇编程序可以为用户空间位操作提升。

OTOH,与编写一个小的通用位操作包含文件来实现相同的结果相比,开发工作可能不值得。

于 2021-03-21T13:33:46.660 回答