web-dev-qa-db-ja.com

Linuxカーネルのバージョンを確認するマクロ定義はありますか?

変数の型を適切に設定できるように、Linuxカーネルのバージョンを教えてくれるgccマクロがあるかどうか疑問に思っています。そうでない場合、これを行う独自のマクロを定義するにはどうすればよいですか?

28
zztops

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.hutsname関数を使用することです。

char *my_kernel_version = utsname()->release;

これは、本質的に/proc/versionが現在のカーネルバージョンを取得する方法です。

こちらもご覧ください

実行時にLinuxカーネルモジュールからカーネルバージョンを取得する

62
Vilhelm Gray

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_xu.k_y、またはu.k_zデータにアクセスする必要があります。

1
ldav1s