変数の型を適切に設定できるように、Linuxカーネルのバージョンを教えてくれるgccマクロがあるかどうか疑問に思っています。そうでない場合、これを行う独自のマクロを定義するにはどうすればよいですか?
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
実行時にバージョン情報を取得するより良い方法は、 include/linux/utsname.h でutsname
関数を使用することです。
char *my_kernel_version = utsname()->release;
これは、本質的に/proc/version
が現在のカーネルバージョンを取得する方法です。
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
データにアクセスする必要があります。