Как использовать bitops.h в пространстве пользователя

У меня есть эта программа, где мне нужно сделать некоторые битовые операции, используя функцию test_and_set_bit, найденную в файле bitops.h. Как я могу включить этот файл, используя #include<linux/bitops.h> в моем C файл. Кажется, он этого не находит, хотя я могу найти его в исходном коде ядра.

Это потому, что не разрешено включать в программу пространство пользователя. Предложения?

я использую #include<linux/bitops.h> затем с помощью компиляции gcc myfile.c,

Он не показывает такого файла или каталога для файла bitops.h. Я мог бы найти его в каталоге ядра, хотя

0

Решение

Я предлагаю вам изменить #include<linux/bitops.h> в #include <asm/bitops.h>,

Если проблема остается, вы должны использовать gcc myfile.cpp -I"your linux directory" сказать gcc где ваш файл ядра.

1

Другие решения

Будь осторожен с 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));
}
1