Linuxカーネルモジュールコード(カーネルモード)内から実行されているカーネルのバージョンに関するランタイム情報を取得するにはどうすればよいですか?
3 に答える
慣例により、Linuxカーネルモジュールのロードメカニズムでは、実行中のカーネルに対してコンパイルされていないモジュールをロードすることはできません。したがって、参照している「実行中のカーネル」は、カーネルモジュールのコンパイル時にすでに認識されている可能性があります。
<linux/version.h>バージョン文字列定数を取得するには、古いバージョンでは、、その他<linux/utsrelease.h>、および新しいバージョンを含める必要があります<generated/utsrelease.h>。実行時にさらに多くの情報を取得したい場合は、utsname()関数fromlinux/utsname.hが最も標準的な実行時インターフェイスです。
仮想/proc/versionprocfsノードの実装はを使用しますutsname()->release。
コンパイル時にカーネルバージョンに基づいてコードを調整する場合は、次のようなプリプロセッサブロックを使用できます。
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
...
#else
...
#endif
メジャー/マイナーバージョンと比較できます。
一度に安全に構築できるのは、任意の1つのカーネルバージョンのモジュールのみです。これは、実行時にモジュールからの要求が冗長であることを意味します。
UTS_RELEASE最近のカーネル の価値を調べることで、ビルド時にこれを見つけることができます。これは、<generated/utsrelease.h>他の方法の中でも特にそうです。
どのバージョンのカーネルモジュールも作成できないのはなぜですか?
カーネルツリーAPIで説明されているように、カーネルモジュールAPIは設計上不安定であるため、次のようになりますDocumentation/stable_api_nonsense.txt。要約は次のとおりです。
Executive Summary
-----------------
You think you want a stable kernel interface, but you really do not, and
you don't even know it. What you want is a stable running driver, and
you get that only if your driver is in the main kernel tree. You also
get lots of other good benefits if your driver is in the main kernel
tree, all of which has made Linux into such a strong, stable, and mature
operating system which is the reason you are using it in the first
place.
参照:すべてのカーネルリリースと互換性があるようにLinuxカーネルモジュールを構築する方法は?
コンパイル時にそれを行う方法は次の場所で尋ねられました:Linuxカーネルのバージョンをチェックするためのマクロ定義はありますか?