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

推薦する

SQL ストアド プロシージャの取得、データ取得、プロセス分析

この記事は主に、SQL のストアド プロシージャから返されたデータを取得するプロセスの分析を紹介しま...

Vue.jsフレームワークはショッピングカート機能を実装します

この記事では、ショッピングカートを実装するためのVue.jsフレームワークの具体的なコードを参考まで...

Vue プロジェクトにおけるトランジション コンポーネントの適用の概要

​Vue のトランジションは、アニメーション トランジションをカプセル化するコンポーネントです。一般...

JavaScript の instanceof メソッドの手動実装

1. instanceofの使用法instanceof演算子は、コンストラクター関数のprototy...

MySQL Binlog ログの読み取り時によくある 3 つのエラー

1. mysqlbinlog: [エラー] 不明な変数 'default-character...

MySQL インデックスの原理と最適化の詳細な説明

序文この記事は Meituan の大物によって書かれました。とても素晴らしいので、皆さんと共有したい...

MySQL 8の新機能である降順インデックスの基礎となる実装の詳細な説明

降順インデックスとは何ですか?インデックスについてはよくご存知かもしれませんが、降順インデックスにつ...

vue3.0 sfcのセットアップの変更について簡単に説明します。

目次序文標準的なSFCの書き方スクリプト設定可変露出部品の取り付け小道具カスタムイベント要約する序文...

フロントエンド開発に必須:推奨されるブラウザ互換性テストツール 12 選

フロントエンド開発者にとって、さまざまな主要ブラウザのさまざまなバージョンでコードが適切に動作するこ...

Linux インデックスノード inode の詳細な説明

1. inodeの紹介inode を理解するには、まずファイル ストレージから始める必要があります。...

Docker コンテナのマウントディレクトリ操作の表示

Dockerコンテナのマウントディレクトリ情報のみを表示する docker 検査 --format ...

SQL と MySQL のステートメント実行順序の分析

今日、問題が発生しました: MySQL の insert into、update、delete ステ...

Vue における $router と $route の違いの詳細な説明

通常、vue プロジェクトではルーティングを使用します。vue-router は vue.js の公...

Nginx 構成 80 ポート アクセス 8080 とプロジェクト名アドレス メソッド分析

Tomcatはプロジェクトにアクセスします。通常はIP + ポート + プロジェクト名です。 Ngi...

NavicatでMySqlスケジュールタスクを作成する方法の詳細な説明

Navicat で MySql スケジュールタスクを作成する詳細な説明イベントは、MySQL が特定...