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 マスタースレーブレプリケーションメカニズムの包括的な分析

目次マスタースレーブレプリケーションメカニズム非同期レプリケーション準同期レプリケーションマスタース...

Vueはドラッグプログレスバーを実装します

この記事では、ドラッグプログレスバーを実現するためのVueの具体的なコードを例として紹介します。具体...

HTMLベースの複数画像アップロードのプレビュー機能を実装

最近、Web ページに複数の画像をアップロードするためのスクリプトを作成しました。これは非常に実用的...

MySQL 5.7.19 Winx64 ZIP アーカイブのインストールと使用に関する問題の概要

今日はMySQLのインストール方法を学びましたが、その過程でいくつか問題が発生しました。関連記事をい...

カタツムリ映画システムのDocker展開の詳細なプロセス分析

環境に関する声明ホストOS: Cetnos7.9 最小インストールdocker バージョン: 20....

Docker Alpine イメージのタイムゾーン問題に対する完璧な解決策

最近、Docker を使用して Java アプリケーションをデプロイしていたときに、タイムゾーンが間...

モバイルデバイス上の 1px 境界線を解決する最善の方法 (推奨)

モバイル デバイス向けに開発する場合、Retina 画面上で要素の境界線が太くなるという問題に遭遇す...

HTML テーブル マークアップ チュートリアル (37): 背景画像属性 BACKGROUND

テーブル ヘッダーの背景画像を設定します。任意の GIF または JPEG 画像ファイルを使用できま...

Mysql は null 値の first/last メソッドの例を実装します

序文MySQL が SQL SELECT コマンドと WHERE 句を使用してテーブルからデータを読...

JavaScript es6 における var、let、const の違いの詳細な説明

まず、よくある質問は、ECMAScript と JavaScript の関係は何ですか? ECMAS...

MySQL DML ステートメントの概要

DML 操作とは、データベース内のテーブル レコードに対する操作を指し、主にテーブル レコードの挿入...

React コンポーネント通信ルーティングパラメータ転送 (react-router-dom)

目次最近Reactを勉強していて、今は仕事でVueを使っています。学習の過程で、両者を比較して理解を...

Docker+nextcloudで個人用クラウドストレージシステムを構築

1. Dockerのインストールと起動 yum で epel-release をインストールします ...

静的リソースファイルのアクセスログをフィルタリングするNginxの実装

乱雑なログ日常的に使用される Nginx は、静的リソース サーバーとリバース プロキシ サーバーの...

複数の画像を切り替えるJavaScript

この記事では、複数の画像を切り替えるJavaScriptの具体的なコードを参考までに紹介します。具体...