Ubuntuはカーネルモジュールをコンパイルし、その内容はシステムログに反映されます。

Ubuntuはカーネルモジュールをコンパイルし、その内容はシステムログに反映されます。

1.Linuxログインインターフェース

1. 現在のファイルディレクトリを確認します。

Xshell経由でLinuxシステムに接続した後

コマンドを入力してください: ls

ここに画像の説明を挿入

2. 新しいコード/カーネルフォルダを作成する

ここに画像の説明を挿入

2. コードを書く

1. hello_module.cを作成する

コマンド: vim hello_module.c

2. iを押して編集モードに入り、次のコードを入力します。

 //hello_module.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> ​ static int __init hello_init(void){ printk("This is hello_module, welcome to Linux kernel \n"); return 0; } ​ static void __exit hello_exit(void){ printk("see you next time!\n"); } ​ module_init(hello_init); module_exit(hello_exit); ​ MODULE_LICENSE("GPL"); MODULE_AUTHOR("Mr Q"); MODULE_DESCRIPTION("hello kernel module"); MODULE_ALIAS("hello");

ここに画像の説明を挿入

上記のコードの説明は次のとおりです。
(1) #include <linux/module.h>: 必須。 module.h ヘッダー ファイルには、モジュールの構造定義とモジュールのバージョン管理が含まれています。すべてのモジュール プログラムにはこのヘッダー ファイルを含める必要があります。
(2)#include <linux/kernel.h>:kernel.hには、上記のプログラムのprintk()関数など、よく使用されるカーネル関数が含まれています。
(3)#include <linux/init.h>: 必須。 init.h には module_init() および module_exit() 関数の宣言が含まれています。
(4) module_init(): 必須。モジュール読み込み機能。モジュールを読み込むときに、この関数が自動的に実行され、初期化操作を実行します。
(5) module_exit(): 必須。モジュールアンインストール関数。モジュールをアンインストールするときに自動的に実行され、クリーンアップ操作を実行します。(6)MODULE_LICENSE():モジュールコードによって承認されたソフトウェアライセンス契約を示します。 Linux カーネルは GPL V2 を使用するオープン ソース プロジェクトであり、Linux カーネル コードを使用および変更するすべての個人または組織は、変更されたソース コードを公開する必要があります。これは必須のオープン ソース契約であるため、通常、ドライバー コードを作成するときは、この契約を明示的に宣言して従う必要があります。そうしないと、カーネル UI が汚染された警告を発します。
(7)MODULE_AUTHOR():モジュールの著者情報を記述します。
(8)MODULE_DESCRIPTION():モジュールの目的と機能を簡単に説明する。
(9)MODULE_ALIAS():ユーザーコントロールに提供されるエイリアス。
(10) printk(): カーネル出力関数。デフォルトではシステムファイル「/var/log/kern.log」の内容を出力します。

3. 保存して終了し、ESC キーを押してファイル ディレクトリを表示します。
:wq

ここに画像の説明を挿入

3. Makefileを書く

vim メイクファイル

 obj-m := hello_module.o
 ​
 カーネルビルド:= /lib/modules/$(shell uname -r)/build
 CURRENT_PATH := $(シェルのパスワード)
 ​
 全て:
     make -C $(KERNELBUILD) M=$(CURRENT_PATH) モジュール
 ​
 クリーン:
         make -C $(KERNELBUILD) M=$(CURRENT_PATH) をクリーンにする

上記のコードの説明は次のとおりです。
(1) obj-m := <モジュール名>.o: 生成するモジュールの名前を定義します (2) KERNELBUILD := /lib/modules/$(shell uname -r)/build: KERNELBUILD は、実行中の Linux のカーネルコンパイルディレクトリを指すために使用されるカスタム名です。ここで、「uname -r」識別子は、対応するカーネルバージョンを示します。
(3)CURRENT_PATH := $(shell pwd): CURRENT_PATHは現在のディレクトリを指すために使用されるカスタム名です。
(4) all: コンパイルによって実行されるアクション (5) clean: make cleanに必要なアクション。 「make clean」は、最後の make コマンドによって生成されたオブジェクト ファイル (拡張子が「.o」のファイル) と実行可能ファイルを消去するために使用されます。

:wq 保存して終了

4. コンパイル:

次のコマンドを入力します: make

ここに画像の説明を挿入

コンパイルされたファイルを見ることができます

ここに画像の説明を挿入

コンパイルされたモジュールを確認する

ここに画像の説明を挿入

modinfo コマンドを使用してさらに確認することもできます。

ここに画像の説明を挿入

5. モジュールを挿入する

insmod コマンドを使用してモジュールを挿入します。挿入が完了したら、lsmod コマンドを使用して、現在のモジュールがシステムにロードされているかどうかを確認できます。

ここに画像の説明を挿入

1つ目は。

システムがモジュールをロードすると、「/sys/module」ディレクトリの下にモジュールにちなんで名付けられた新しいディレクトリも作成されます。

ここに画像の説明を挿入

6. ログ出力を表示する

このデモでは prink() はデフォルトの出力レベルを使用するため、出力結果は「dmesg」または「tail /var/log/kern.log」コマンドで確認できます。

ここに画像の説明を挿入

Ubuntu のカーネル モジュールのコンパイルとシステム ログに反映される内容に関するこの記事はこれで終わりです。Ubuntu のカーネル モジュールのコンパイルに関するより関連性の高い内容については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Ubuntu 12.04 でカーネルツリーを構築する実装プロセスの詳細な説明
  • Ubuntu 16.04 カーネルのアップグレード手順

<<:  MySQL の結合フィールドの Concat()

>>:  CSS3 と JavaScript を使用して Web カラー ピッカーのサンプル コードを開発する

推薦する

MySql 自動切り捨て例の詳細な説明

MySql 自動切り捨て例の詳細な説明友人が質問しました。プロジェクト内で挿入または更新ステートメン...

Windows 10 で MySQL を完全にアンインストールして再インストールするための詳細な手順

さまざまな理由で、誰もが MySQL を再インストールする必要があると思います。 MySQL と Q...

自動同期テーブル構造のMySql開発

開発の問題点開発プロセスでは、データベース フィールドが頻繁に変更されるため、RD 環境と QA 環...

このようなシェル スクリプトを使用して、多数の MySQL データベースを強制終了します (推奨)

朝早くに電話で起こされました。あるプロジェクトのデータベースがダウンしていて起動できないとのことでし...

HTML メタの説明

導入メタタグは、HTML言語のHEAD領域にある補助タグです。 meta は、ページの説明、キーワー...

回転するフリップカードアニメーションの効果を実現するCSS

回転フリップ効果の CSS アニメーション、具体的な内容は次のとおりです。 1. まず2つのボックス...

VueはCanvasを使用してランダムなサイズで重なり合わない円を生成します

目次キャンバス関連文書エフェクト画像表示ケースの完全なコード親コンポーネントコードサブコンポーネント...

操作タイムアウトがないときにMySQLサーバーがアクティブに切断される問題を解決します

MySQL サービスを使用する場合、通常の状況では、MySQL のタイムアウト設定は 8 時間 (2...

Tomcat セキュリティ仕様 (Tomcat セキュリティ強化と仕様)

tomcat はオープンソースの Web サーバーです。Tomcat ベースの Web は実行効率...

MySQL水平および垂直テーブル変換操作の実装方法

この記事では、例を使用して、MySQL の水平テーブルと垂直テーブル間の変換操作を実装する方法を説明...

mysql5.7.18 のインストール時にエントリが見つからない問題の解決方法

mysql5.7.18のインストール時に次の問題が発生しました: プログラム入力ポイントfesetr...

HTML テーブルインライン形式の詳細な説明

インライン形式<colgroup>...</colgroup>属性名 属性値...

MySQLデータベースに画像を保存するいくつかの方法

通常、ユーザーがアップロードした写真はデータベースに保存する必要があります。一般的に、解決策は 2 ...

Windows での MySQL スケジュールバックアップ スクリプトの実装

Windows サーバーでデータベース データを定期的にバックアップする場合は、Windows タス...

Vue コンポーネント ライブラリ ElementUI はテーブル読み込みツリー データのチュートリアルを実装します

ElementUIは、参考のためにテーブルツリーリストの読み込みチュートリアルを実装しています。具体...