我有这个程序,我需要使用 bitops.h 文件中的 test_and_set_bit 函数进行一些位操作。如何#include<linux/bitops.h>
在我的文件中包含此C
文件。即使我可以在内核源代码中找到它,它似乎也没有找到它。
是不是因为不允许包含在用户空间程序中。建议?
我正在使用#include<linux/bitops.h>
然后使用gcc myfile.c
.
它没有显示 bitops.h 文件的此类文件或目录。我可以在内核目录下找到它
我有这个程序,我需要使用 bitops.h 文件中的 test_and_set_bit 函数进行一些位操作。如何#include<linux/bitops.h>
在我的文件中包含此C
文件。即使我可以在内核源代码中找到它,它似乎也没有找到它。
是不是因为不允许包含在用户空间程序中。建议?
我正在使用#include<linux/bitops.h>
然后使用gcc myfile.c
.
它没有显示 bitops.h 文件的此类文件或目录。我可以在内核目录下找到它
小心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));
}
建议你#include<linux/bitops.h>
改成#include <asm/bitops.h>
.
如果问题仍然存在,您必须使用gcc myfile.cpp -I"your linux directory"
来判断gcc
您的内核文件在哪里。
我尝试使用搜索路径包含来自/usr/src/linux-headers-$(uname -r)(在内核构建期间安装)的各种内核头文件,但都需要一个或多个其他内核头文件。-I kernel_header_path
看起来./include/linux/bitops.h是所有特定于架构的位操作的建议包含文件。
所以,我同意@nos:使用内核代码进行用户空间位旋转并不容易。但是,arch/../include/asm/bitops.h中的特定于拱门的汇编程序可以为用户空间位操作提升。
OTOH,与编写一个小的通用位操作包含文件来实现相同的结果相比,开发工作可能不值得。