У меня есть эта программа, где мне нужно сделать некоторые битовые операции, используя функцию test_and_set_bit, найденную в файле bitops.h. Как я могу включить этот файл, используя #include<linux/bitops.h>
в моем C
файл. Кажется, он этого не находит, хотя я могу найти его в исходном коде ядра.
Это потому, что не разрешено включать в программу пространство пользователя. Предложения?
я использую #include<linux/bitops.h>
затем с помощью компиляции gcc myfile.c
,
Он не показывает такого файла или каталога для файла bitops.h. Я мог бы найти его в каталоге ядра, хотя
Я предлагаю вам изменить #include<linux/bitops.h>
в #include <asm/bitops.h>
,
Если проблема остается, вы должны использовать gcc myfile.cpp -I"your linux directory"
сказать gcc
где ваш файл ядра.
Будь осторожен с bitops.h
, Это может привести к неопределенному поведению из четко определенных источников.
Например, для Язык C / C ++ (см. Раздел 5.8), сдвиг не может быть отрицательным, не может быть равен длине слова и не может превышать длину слова. Это означает, что 32-битное значение может быть смещено только на [0,31] включительно.
В приведенном выше примере все, кроме [0,31], является «неопределенным». Я считаю, что компилятор свободен делать то, что он хочет для неопределенного кода, в том числе удаление нарушающего кода, вызов abort()
или гадить по всему самому себе.
Многие программы злоупотребляют сменами и поворотами. Отличный способ проверить / проверить — это использовать Джона Регера и Пэн Ли Проверка переполнения целых чисел (IOC). Легко построить Clang с функциональностью (-fcatch-undefined-ansic-behavior
), поэтому инструменты доступны для проверки этих вещей.
С учетом сказанного ниже приведен код ядра 3.8. <linux\bitops.h>
(скачано ФЕВ-19-2013). Если программист отправляет в размере смены 0
(Юридическое), <linux\bitops.h>
создаст нелегальный код из-за (word << (32 - shift))
(и другие).
Когда я указал на это в списке рассылки ядра, мне сказали, что «ядро не пытается быть полностью совместимым со стандартом». Часть проблемы с ядром, кажется, Торвальдс и его «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));
}