単純なドライバモジュールの場合、以下はMakefileの標準的な構成です。
//------------ Makefile ---------------------- obj-m:= hello.o KERNELDIR:= /lib /modules /$(シェルのuname -r)/build PWD: = $(シェルPWD)モジュール:$(MAKE)-C $(KERNELDIR)M = $(PWD)modules_install:$(MAKE)-C $(KERNELDIR)M = $(PWD)は、#は、フロントタブmodules_installことに注意しなければならないモジュール#注意しなければならないフロントタブ
個々の文以下の分析:
OBJ-M:= hello.o
$:ls /lib /modules /
<です。 Br> 2.6.38.2 2.6.38-8-generic
PS
ログイン
;(&Mdash ldd3のP29引用)、メイクファイルが述べ、その一例があります/Makefileの簡単なOBJ-M:= hello.o
が、変換モジュール、次のコマンドを使用します。
$:-C〜/カーネル2.6メートル= 'のPWD' モジュール
ここ"します。 〜/kernel-2.6"はどこに置くかによって、カーネルソースツリーのディレクトリなので、ネイティブ環境のコマンドは次のようになります。
$:make -C /usr/src/linux-source-2.6 38 M = $ PWDモジュール
最終結果は最初の方法とまったく同じです。
それでは、これらの2つの方法を比較してみましょう知っている可能性があり、実際には、それらの間の唯一の違いは、それぞれ、ソースディレクトリと同じではありません、" /libに/モジュール/$(シェルのuname -rと)/構築"そして" /usr/src/linux-source-2.6.38/"が、あなたは、カーネルをコンパイルした場合は、解凍して、ソースコードは、通常usrディレクトリの下に、私たち自身のダウンロードであることを、知っている、とlibディレクトリになりますされますコンパイル時に過去を自動的にコピーします。2つのファイル構造はまったく同じです。したがって、make効果がまったく同じであることは驚くに当たりません。
こんにちは、カーネルモジュールの例
C言語を学ぶとき、私たちはこんにちは、世界のプログラムを学びます。感じる冗長である:
C ++の#include<ためのコードと、stdio.hの>
生徒に2つの質問について考えてもらいます。なぜmain()関数を書く必要があるのですか。カーネルCプログラムはmainが必要ですか?
こちら#include< stdio.h>はprintf()を使用するためのものですが、実際にはすべてC言語ライブラリの関数ですが、カーネルプログラムで使用できますか。
C言語アプリケーションは、アプリケーションのエントリポイントであるため、main()関数を持っている必要があります。必須です。カーネルモジュールにはカーネルモジュールがあるので、Cアプリケーションにはアプリケーション仕様があります。したがって、カーネルモジュールフレームワークを書くときは、これがルールであることを忘れないでください。
2番目の質問については、より重要です:あなたは覚えていれば、我々はfopenを言った、アプリケーションは、C言語の標準ライブラリの関数を呼び出すことができ、カーネルは絶対に不可能となり、オープンシステムコールに依存していますそして、システムコールはカーネルエクスポートです、そして、もし我々がカーネルプログラムで標準的な関数ライブラリを使用することができるならば、それは「むしろ」鶏肉または卵子に転送されます。
次のプログラムはLinuxカーネルモジュールの標準フレームワークです(私が最初に学んだときに先生がこのコードを書いた方法を見てください)。リナックス/module.h>
これはHelloです。私たちはハロープリントアウト達成する必要がある場合は、フレームカーネルモジュール、カーネル、我々は唯一のようhello_initを変更する必要があります:static int型__init hello_init(無効){のprintk('こんにちは、カーネル/N'); 0を返す;}モジュールフレーム次の4つの部分で構成されています。
(1)ロード時にモジュールが実行する必要があるmodule_init(関数)、およびmodule_init ()Module_exit機能を指定し、で定義されている(機能)だけでなく、module_exit(機能)でのアンインストール時に実行モジュール。あなたはmodule_exit()を使用して宣言すると、そのモジュールは、動的アンインストール機能を持っていません。
(2)module_init()で呼び出される初期化関数と、module_exit()で使用されるクリーンアップ関数を定義する必要があります。初期化関数が負でない値を返す場合にのみ(カーネルでは負の値は操作が失敗したことを示すため)、カーネルモジュールは正しくロードできます。そうでなければモジュールはロードできません。 cleanup関数はvoid型を返します。一般に、初期化関数はモジュールがロードされたときにリソースを要求するために使用され、クリーンアップ関数はモジュールがアンロードされたときにリソースを解放するために使用されます。これはC ++のコンストラクタおよびデコンストラクタに似ています。
(3)カーネルモジュール用のヘッダファイルは、< linux /module.h>および< linux /init.h>を使用する必要があります。 <>はヘッダーファイルをインクルードするために使用されることに注意することは重要ですが、前述のようにカーネルモジュールは標準ライブラリを参照できないため、これらのヘッダーファイルのどちらも標準関数のヘッダーにはなりません。機能ここのヘッダファイルは実際にはLinuxカーネルソースパスの下の$(KERNELSRC)/includeディレクトリから来ています。
(4)MODULE_XXXで表される関連コンテンツ、これらは現在のカーネルモジュールの説明ですが、必須ではありませんが、一般的に、いくつかの項目、特にモジュールのライセンス問題を記入してください。 。もちろん、それはまたあなた自身のために名前を作る機会をあなたに与えます、そしてまたあなたは責任があるべきです。モジュールの詳細な説明は、後でエラーをデバッグするのに役立ちます。 Modinfoを使用すると、モジュールをすばやく識別できます。必要に応じて、LDDを参照してください(<<<<>>>"""""""
この期間win8.1のMac OS X 10.9マーベリックス2つのオペレーティングシステムほぼ同時にリリース、実際には、Ubuntu 13.10もあります。さて、私はMacを買うお金がない貧しい人
しばらく前に、QQで助けを求めて友人に会いました。彼らが買ったVPSは起動できない、1年間のハードワークがこのVPSに注がれています。回復、唯一のシステムを再インストールすることができます、友人のこの
でIPアドレスの競合を見つける方法あなたは誰もが正しいIPアドレスを知っていますか?それらを表すために、ネットワーク上のデバイスに割り当てられています。それらはDHCPサーバーを介して配布され、頻繁に
1のLinuxでのリモート接続のSSHとVNCグラフィカルモードは、VNCは/停止/再起動#serviceが開始vncserverを起動/停止/再起動して、特定のコマンドのvncserverをシャット