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

推薦する

Docker コンテナを他のサーバーに移行する 5 つの方法

多くの場合、移行は避けられません。ハードウェアのアップグレード、データ センターの変更、古いオペレー...

Linux システムで grub.cfg ファイルの破損を修復する手順

目次1. grub.cfg ファイルの紹介1. grub.cfg ファイルの場所2. grub.cf...

React 手書きタブ切り替え問題

親ファイル React をインポートし、{useState} を 'react' か...

uniapp パッケージ化されたアプレット レーダー チャート コンポーネントの完全なコード

効果画像:実装コードは以下のとおりですビュー <canvas id="radar-c...

CentOS 8 に Postfix メール サーバーをインストールして設定する方法

Postfix は、Linux システム上で電子メールをルーティングまたは配信するために使用される無...

10 種類のモダンなレイアウトを実現するための CSS コード

序文日曜日に自宅で web.dev の 2020 3 日間ライブを視聴したところ、興味深い点がたくさ...

MySQL SQL ステートメントが遅い場合の一般的な原因と解決策

1. インデックス不足または無効なインデックスによるクエリの遅延数千万件のデータを含むテーブルで、イ...

CSS3 カウントダウン効果

成果を達成する実装コードhtml <div クラス = 'ラッパー'> ...

Tableとdivの簡単な紹介と使い方

ウェブフロントエンド1学生証名前性別年01張三男20 02李思女性21総人数60フォームのコンポーネ...

Vue2.x における双方向バインディングの原理と実装

目次1. 実施プロセス2. オブザーバーを表示する3. ウォッチャーを実装する4. コンパイルを実装...

Vue 親コンポーネントが子コンポーネント関数の実装を呼び出す

Vue親コンポーネントは子コンポーネントの関数を呼び出す親コンポーネントはイベントを通じて子コンポー...

vue3ソースコード解析の簡単な実装方法

目次序文🍹準備🍲vue3 の使い方🍖 実装要約する序文最近、私の最初の公式 vue3 + ts プロ...

JavaScript の基礎: スコープ

目次範囲グローバルスコープ関数のスコープもし、スイッチ、のために、その間ブロックスコープスコープチェ...

Dockerはbusyboxを使用してベースイメージを作成します

Docker イメージの最初の行は FROM alpine などのイメージで始まりますが、最初のベー...

HTML の 2 つのタブ ナビゲーション間の競合の解決方法

まず問題の説明から始めましょう:同じページで、1 つのタブに float:left が必要で、もう ...