モジュール /ビルド /メイク /テスト / POC /リハーサル /ノート /免責事項 /ライセンス /書籍 /リンク
Linuxカーネルモジュール(LKM)サンドボックスは、Linuxカーネルモジュールの開発を学習、発見、実験するためのさまざまなモジュールのコレクションです。このリポジトリの目的は、Linuxカーネル内で開発を実践し、その他の概念を研究してから、最初のパッチをカーネルに提出することです。
ほとんどのモジュールは、1つの概念を示し、カーネルAPIの使用方法を示します。いくつかのモジュールは、複数の概念を組み合わせて、概念がどのように連携しているかを提示します。たとえば、モジュールLKM_Deviceは文字デバイスにアクセスし、そのメジャー番号を /Procに保存しています。または、モジュールLKM_MEMが /PROC内のファイルによってメモリ /スワップ情報を公開しています。
Linuxカーネルにアプローチしようとする他の開発者にとって価値があることを願っています。
| いいえ。 | モジュール | ソース | 説明 |
|---|---|---|---|
| 1 | LKM DEBUGFS | LKM_DEBUGFS.C | デバッグファイルシステムDEBUGFSの使用方法を示すモジュール |
| 2 | LKMデバイス | lkm_device.c | キャラクターデバイスで操作する方法を示すモジュールとデバイス情報の保存 /proc |
| 3 | LKMデバイス番号 | lkm_device_numbers.c | 静的かつ動的に割り当てられたデバイス番号を示します |
| 3 | LKMメモリ | LKM_MEM.C | モジュールメモリを公開し、情報を /procに交換します |
| 4 | LKMメモリベースのデバイス | LKM_MEV.C | Scullにある程度基づくメモリベースのキャラクターデバイスのドライバーは、本Linuxデバイスドライバー、第3章で開発されました |
| 5 | LKMパラメーター | LKM_PARAMETERS.C | ユーザーからカーネルスペースにパラメーターを渡すためのモジュール |
| 6 | lkmかなり印刷 | LKM_PP.C | プリティプリントの統合をテストするためのモジュール |
| 7 | LKM Proc | lkm_proc.c | シーケンシャルI /Oを使用したモジュールアクセス /Procファイルシステム |
| 8 | LKMプロセス | lkm_process.c | 現在のプロセス情報へのアクセスと印刷 |
| 9 | LKMサンドボックス | lkm_sandbox.c | さまざまな実験用のサンドボックスモジュール |
| 10 | LKMスケルトン | LKM_SKELETON.C | 新しいモジュールのより速い足場のためのスケルトンモジュール |
初めてクローンを作成するときは、クローンをクローンして、 --recurse-submodulesをサブモジュールして、プリティプリントも取得します。
git clone --recurse-submodules [email protected]:tpiekarski/lkm-sandbox.gitmake clean && make
基本的なロード/アンロードやすべての追加の概念テストなど、利用可能なすべてのテストを実行するには。
make testカーネルリングバッファーの荷重、アンロード、出力によるテスト(sudoはルート許可を要求します)。
make test-module name= < module-name >ロードモジュール、 /procから主要なデバイス番号の収集、デバイスの作成、最終メッセージの比較など、サンドボックスデバイスの追加テストは、 make test-deviceでMakeFileターゲットを実行するか、次のコマンドを実行します。
キャラクターデバイスを作成するためには、メジャーナンバーが必要であり、ファイル /Proc /LKM_Device_Majorをキャットすることで取得できます。このメジャー番号は、カーネルリングバッファーにも書かれています。モジュールパラメーターparam_major_numを使用してこのメジャー番号を提供し、 sudo insmod lkm_device.ko param_major_num=241のようなこのモジュールをロードすることが可能です(この瞬間、この静的割り当ては信頼できないようです。サンドボックスデバイスの登録は時々失敗します。
sudo insmod lkm_device.ko
dmesg | grep " Registered sandbox device "
sudo mknod /dev/lkm_device c $( cat /proc/lkm_device_major ) 0
test -c /dev/lkm_device && cat /dev/lkm_device || echo " Device /dev/lkm_device " not found. "
sudo rmmod lkm_deviceロードモジュールを含む /Procへのサンドボックスアクセスの追加テスト、内部 /procが存在するかどうかのテスト、そのファイルの出力。 make test-procまたは次の数少ないコマンドでMakeFile Target Test-Procを実行します。
sudo insmod lkm_proc.ko
test -f /proc/lkm_proc && cat /proc/lkm_proc || echo " File /proc/lkm_proc not found. "
sudo rmmod lkm_procモジュールにパラメーターを渡すための追加テストLKM_PARAMETERS make test-parametersを実行します。これにより、モジュールがロード/アンロードされ、/sysファイルシステム(/sys/module/lkm_parameters/*)で読み取り値をモジュールに読み込むときに渡されたパラメーター数とメッセージを比較します。または、次のコマンドを実行します。
sudo insmod lkm_parameters.ko number=33 message= " Some message... "
cat /sys/module/lkm_parameters/parameters/number
cat /sys/module/lkm_parameters/parameters/message
sudo rmmod lkm_parametersトリアージング、デバッグ、バグや問題の作業中は、いくつかのコードを試してPOCを書いていくつかのステートメントを証明したり、質問に答えるのに役立ちます。以下には、最近出会った声明、アイデア、質問を証明するためにリードをフォローアップするようなPOCのコレクションがあります。
| ファイル | 説明 | モチベーション |
|---|---|---|
| 比較-IOPL-IOPERM.C | IOPLとIOPERMによって付与されたI/O許可を比較します | バグ205317 -IOPL(2) - 特権レベルは、プロセスごとに設定されていますか、それともスレッドごとに設定されていますか? |
| permissions-revisited.c | クローン、フォーク、execve、またはpthreadを使用する場合、I/Oアクセス許可はどのように付与されますか? | バグ205317 -IOPL(2) - 特権レベルは、プロセスごとに設定されていますか、それともスレッドごとに設定されていますか? |
カーネルスペースの概念をよりよく理解するには、Cと標準ライブラリの基本的な基本を確認し、リハーサルする必要があります。理解を向上させることができることは、アプローチを比較することが可能です。これらの基本のほとんどは低レベルで、ファイルI/Oから始めて、コンパニオンソースとして調べることができます。物事をリハーサルすることは決して悪いことではありませんが、そのようなものをリハーサルしなければならないことを認めるのは少し恥ずかしいことです:)
| ファイル | コンセプト |
|---|---|
| clone.c | clone()を使用したクローニングプロセス |
| execve.c | execve()で別のプロセスを実行する |
| Fork.C | fork()で子プロセスを作成する |
| io_ports.c | 低レベルのポートマップI/O操作 |
| read.c | バニラのファイルの読み取りc |
| Simple_circular_buffer.c | シンプルで率直な円形バッファー |
| write.c | バニラのファイルへの書き込み/アプローチc |
これらのファイルをビルドするには、実行するだけでmake clean && make in in ./rehearsals/ rehearsals/ make clean/
「Linuxカーネルモジュールは、X86〜64プロセッサで最も低く保護されていない実行リングであるリング0で実行されるLinuxカーネルに直接挿入されるコンパイルされたバイナリコードです。」
「従来のアプリケーション開発パラダイムは、大部分が破棄される可能性があります。モジュールのロードとアンロードを除いて、シーケンシャルパターンで動作するのではなく、システムイベントに応答するコードを作成することになります。」
「カーネルの開発により、アプリケーション自体ではなく、APIを書いています。」
このリポジトリは、モジュールの読み込み/アンロードやLinux/GNUシステムのファイルへのアクセスなどの特定の操作がルート特権に依存するため、ルート許可を求めます。 MakeFileは、これらの許可が使用されるものについて事前に述べています。
このリポジトリをSudoを検索して、このすべての操作を確認し、これがいかなる方法でも誤用されないことを確認できます。私はこれがセキュリティの問題になる可能性があることを知っていますが、私はこのプロセスを可能な限り透明にしようとしています。ただし、これらのモジュールは保証なしで来ていることにも注意してください。カーネルのパニックとデータの損失が発生する可能性があります。仮想マシン内でそれらを使用してください。
以下には、sudoが使用されるすべての場所を持つテーブルがあります(readme.mdを除く)。
grep -n -r " sudo " *| ファイル:行 | sudoの使用 |
|---|---|
| MakeFile:118 | |
| MakeFile:119 | $(eval number_file_content = sudo cat $(number_file) ) |
| MakeFile:122 | |
| MakeFile:123 | |
| MakeFile:126 | @sudo rmmod $(module_filename) |
| MakeFile:140 | @sudo mknod $(device_filename)c cat $(proc_filename) 0 |
| MakeFile:143 | @sudo rm $(device_filename) |
| MakeFile:144 | @sudo rmmod $(module_filename) |
| MakeFile:162 | @sudo rmmod $(module_filename) |
| MakeFile:175 | @sudo mknod |
| MakeFile:176 | @ECHO「テスト」| sudo tee $(device_file) |
| MakeFile:178 | @sudo rm -fv $(device_file) |
| MakeFile:179 | @sudo rmmod $(モジュール) |
| MakeFile:190 | @sudo insmod |
| MakeFile:193 | @sudo rmmod $(モジュール) |
| MakeFile:207 | @sudo rmmod $ {module} |
| MakeFile:219 | @sudo insmod $(module).ko |
| MakeFile:222 | @sudo rmmod $(モジュール) |
| tests.mk:31 | @lsmod | awk '{print $$ 1}' | grep -qe "^$(1)$$" &&(sudo rmmod |
| tests.mk:75 | @sudo dmesg - クリア |
| tests.mk:78 | @sudo rmmod $(1) |
LKM Sandboxはフリーソフトウェアです。フリーソフトウェア財団、ライセンスのバージョン2、または(オプションで)後のバージョンのいずれかで公開されているGNU General Publicライセンスの条件に基づいて、再配布および/または変更できます。
LKMサンドボックスは、それが有用であることを期待して配布されますが、保証はありません。商品性や特定の目的に対するフィットネスの暗黙の保証さえありません。詳細については、GNU一般公開ライセンスを参照してください。
LKMサンドボックスとともに、GNU一般公開ライセンスのコピーを受け取る必要があります。そうでない場合は、https://www.gnu.org/licenses/を参照してください。