Je me demande s'il existe une macro gcc qui me dira la version du noyau Linux afin que je puisse définir les types de variables de manière appropriée. Sinon, comment pourrais-je définir ma propre macro qui fait cela?
Le fichier linux/version.h a une macro appelée KERNEL_VERSION
qui vous permettra de vérifier la version souhaitée par rapport à la version actuelle des en-têtes linux (LINUX_VERSION_CODE
) installée. Par exemple, pour vérifier si les en-têtes Linux actuels sont pour le noyau v2.6.16 ou antérieur:
#include <linux/version.h>
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
...
#else
...
#endif
Une meilleure façon d'obtenir les informations de version au moment de l'exécution est d'utiliser la fonction utsname
dans include/linux/utsname.h .
char *my_kernel_version = utsname()->release;
Voici essentiellement comment /proc/version
obtient la version actuelle du noyau.
Obtenir la version du noyau à partir du module du noyau linux lors de l'exécution
gcc
ne connaîtra pas ces informations. Comme alternative, vous pouvez facilement déterminer un grand nombre d'informations sur le noyau lors de l'exécution.
Vous pouvez définir votre type d'exécution comme
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;
};
et demandez au code lors de l'exécution de regarder /proc/version
(ou tout ce dont vous avez besoin dans l'environnement d'exécution du noyau) et définissez kernel_version
de manière appropriée. Le kernel_x_foo_type
Et al. est votre type que vous souhaitez conditionner à la version du noyau. Le code appelant doit regarder kernel_version
Et accéder aux données u.k_x
, u.k_y
Ou u.k_z
Appropriées.