環境:Ubuntuの16.04
カーネルのランタイムプラグアンドプレイでHelloWorldのモジュールは、いつでも削除することができます。
1、カーネルのソースコードライブラリを構築します
ビューは、オペレーティングシステムのリリース番号が表示されます。
uname -r:表示され、オペレーティング・システムのリリース番号 はuname -a:ディスプレイシステム名、ノード名、オペレーティングシステムのリリース番号、カーネルバージョン、など
カーネルのソースコードの対応バージョンをダウンロードしてください:
須藤はapt-getをインストールLinuxのソース-4.15.0
次のようにダウンロードが完了したら:
コードを解凍します。
タールjxvfのlinux-ソース2.6.20.tar.bz2
Linuxのソース-4.15.0カーネル設定を入力し、最速の元の設定を選択
oldconfig作ります
あなたは、ルートディレクトリの実行に切り替える必要があり
デ・イメージ、bzImageコンパイルダウン
イメージ、bzImageを作ります
时イメージ、bzImageを作る报错スクリプト/サインFILE.C:23:30:致命的なエラー:opensslの/ opensslv.h:そのようなファイルまたはディレクトリ
須藤のlibssl-devのインストールapt-getを
次
メイク・モジュール
このプロセスは、2時間程度の長い時間であります
次回の実行
メイクmodules_install
中/ libに/モジュール/ 4.15.0-45、一般的なコンパイルされたモジュールのファイルが表示されます実行する場合、このパスを構築するためにディレクトリを使用します。
図2に示すように、ライトドライバコード
書式#include <Linuxの/ init.h> の#include <Linuxの/ module.h> //、モジュールは、オープンソースライセンスの持つカーネルを伝える MODULE_LICENSE( "デュアルBSD / GPL"); 静的なint型hello_init(無効) { のprintk(KERN_EMERG「負荷を\ N-世界こんにちは"); 戻り0; } 静的ボイドhello_exit(ボイド) { のprintk(KERN_EMERG" RmmoveのHello World \ N- "); } module_init(hello_init); module_exit(hello_exit)。
コードが表す:カーネルモジュールがhello_init実行される負荷は、モジュールを取り外しhello_exitで呼び出すことです。
私はprintfのを使用することはできませんので、カーネルは、C言語のライブラリコードを使用することはできませんので、カーネルのprintk印刷機能。
Makefileを書きます
OBJ-M:= hello.o KERNELDIR:= / LIB /モジュール/ $(シェルのuname -r)/ビルド PWD:= $(シェルPWD) モジュール: $(MAKE)-C $(KERNELDIR)M = $(PWD )モジュール
そして、コンパイルするメイクを行います
次のように実行した後の結果は以下のとおりです。
必要なのはhello.koファイルです
insmodのhello.ko
ロードモジュールをinsmodの
rmmodはhello.ko
rmmodは削除モジュール
ロード・モジュールでのHello Worldをロード可視モジュールのプリントが印刷RmmoveのHello Worldで除去されます。