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 カラー ピッカーのサンプル コードを開発する

推薦する

Linux で unzip コマンドを使用して複数のファイルを解凍する方法

Linuxにunzipコマンドがない問題の解決策unzipコマンドを使用して.zipファイルを解凍す...

MySQL 学習データベースバックアップの詳細な説明

目次1.DB、DBMS、SQL 2. データベースの特徴3. SQL分類4. MySQLを起動および...

Linux で文字化けしたファイルや特殊文字のファイルを削除する方法

エンコーディングの理由により、Linux サーバーに中国語のファイルやディレクトリをアップロードまた...

CocosCreatorでリストを作成する方法

CocosCreator バージョン: 2.3.4 Cocos には List コンポーネントがない...

MySQL をインストールした後に調整する必要がある 10 のパフォーマンス設定項目

このブログでは、MySQL データベースをインストールした後に調整することが推奨される 10 のパフ...

MySQL ファジークエリステートメントコレクション

SQL ファジークエリステートメント一般的なファジーステートメントの構文は次のとおりです。 SELE...

MySQL インデックスの正しい使い方とインデックスの原理の詳細な説明

1. はじめになぜインデックスが必要なのでしょうか?一般的なアプリケーション システムでは、読み取り...

Linux chkconfig コマンドの使用

1. コマンドの紹介chkconfig コマンドは、システム サービスの実行レベル情報を更新および照...

Jenkins初心者のためのDockerデプロイメントチュートリアルの詳細な説明

この記事では、docker 経由で Jenkins+Maven+SVN+Tomcat をデプロイし、...

CSSスクロールバースタイル設定の実装

Webkit スクロールバー スタイルのリセット1. スクロールバーには、スクロールバー ボタンとト...

VMware vSphere 6.5 インストール チュートリアル (画像とテキスト)

vmware vSphere 6.5 は vSphere ソフトウェアのクラシック バージョンであ...

Docker プルタイムアウトの解決策

最近、Docker イメージのプルが非常に不安定です。遅く、タイムアウトすることがよくあります。 x...

MySQLパスワードを変更するいくつかの方法

序文:データベースを日常的に使用すると、パスワードが単純すぎて変更する必要がある場合、パスワードの有...

Rancher で Kubernetes 用の標準化された VMware イメージを構築する方法

Kubernetes を学習するときは、Kubernetes 環境で練習する必要があります。ただし、...

ウェブカラーのコントラストと調和のテクニックの共有

色のコントラストと調和対照的な状況では、色の相互作用は単一の色によって与えられる感覚とは異なります。...