Мне интересно, есть ли gcc-макрос, который скажет мне версию ядра Linux, чтобы я мог правильно настроить типы переменных. Если нет, как бы я решил определить свой собственный макрос, который делает это?
Есть ли определение макросов для проверки версии ядра Linux?
Ответ 1
В файле linux/version.h есть макрос с именем KERNEL_VERSION
, который позволит вам проверить версию, которую вы хотите, с текущей версией заголовков Linux (LINUX_VERSION_CODE
). Например, чтобы проверить, соответствуют ли текущие заголовки Linux для ядра v2.6.16 или ранее:
#include <linux/version.h>
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
...
#else
...
#endif
Лучший способ получить информацию о версии во время выполнения - использовать функцию utsname
в include/linux/utsname.h.
char *my_kernel_version = utsname()->release;
Это, по сути, как /proc/version
получает текущую проверку ядра.
См. также
Получение версии ядра из Linux-модуля ядра во время выполнения
Ответ 2
gcc
не будет знать эту информацию. В качестве альтернативы вы можете легко определить много информации о ядре во время выполнения.
Вы можете определить тип выполнения, например
struct unified_foo {
unsigned int kernel_version;
union {
kernel_x_foo_type k_x;
kernel_y_foo_type k_y;
kernel_z_foo_type k_z;
} u;
};
и иметь код во время выполнения, посмотрите /proc/version
(или что вам нужно из среды выполнения ядра) и установите kernel_version
соответствующим образом. kernel_x_foo_type
et al. это ваш тип, который вы хотите установить на версию ядра. Вызывающий код должен смотреть kernel_version
и получать доступ к соответствующим данным u.k_x
, u.k_y
или u.k_z
.