Linux カーネル デバイス ドライバー Linux カーネル 基本メモの概要

Linux カーネル デバイス ドライバー Linux カーネル 基本メモの概要

1. Linuxカーネルドライバモジュールの仕組み

静的ロードでは、ドライバモジュールをカーネルにコンパイルし、カーネルの起動時にロードします。動的ロードでは、ドライバモジュールを ko としてコンパイルし、カーネルの起動時にロードします。

2. カーネルドライバを書く

#include <linux/module.h>
#include <linux/init.h>
静的 int __init test_init(void) 
{
return 0; // 成功を示すには 0 を返し、モジュールのロードを終了するには負の数を返します}
//__init カーネルがドライバーを初期化した後、この関数のコード命令空間を解放します static void __exit test_exit(void)
{
....
}
//__exit は、この関数がドライバーがアンインストールされたときにのみ使用され、使用後に解放されることを指定します。module_init(test_init); //モジュール初期化関数として test_init を指定します。module_exit(test_exit); //モジュール終了アンインストール関数として test_exit を指定します。MODULE_LICENSE("GPL"); //サポートされているプロトコルを指定します。MODULE_AUTHOR("Author");
MODULE_DESCRIPTION("説明");
MODULE_VERSION("バージョン");
#define __init __section(.init.text)
#define __initdata __section(.init.data)
char __initdata buf[] = "hello world";
#define __exitdata __section(.exit.data)
#define __exit __section(.exit.text)
/////////////

モジュール情報を表示するにはmodinfo test.ko

cat /proc/modules現在のシステムの動的ロードモジュールを表示します。これはlsmod
と同等です。 lsmod

テスト 1768 0 - ライブ 0xbf03c000

モジュール名、使用メモリサイズ、呼び出し回数、有効性、モジュールが配置されているメモリアドレス

すべてのモジュールを表示するにはls /sys/moduleします。

3. ドライバモジュールのMakefile

  • obj-m += test.o //ソースコードファイルはtest.cです
  • モジュール:make -C カーネルソースディレクトリ M = ドライバコードディレクトリ モジュール
  • モジュールのインストール:make -C カーネルソースディレクトリ M=ドライバコードディレクトリ modules_install INSTALL_MOD_PATH=/ファイルシステムパス
  • clean:make -C カーネルソースディレクトリ M=ドライバコードディレクトリ モジュールクリーン

4. ドライバーの出力メッセージを確認する

/var/log/メッセージを調べる
/var/log/メッセージを追跡する

5. Printk レベル制御

/usr/src/kernels/2.6.18-194.el5-i686/include/linux/kernel.h

<linux/カーネル.h>
#define KERN_EMERG "<0>" /* システムは使用不可です */
#define KERN_ALERT "<1>" /* すぐにアクションを実行する必要があります */
#define KERN_CRIT "<2>" /* クリティカルコンディション */
#define KERN_ERR "<3>" /* エラー条件 */
#define KERN_WARNING "<4>" /* 警告条件​​ */
#define KERN_NOTICE "<5>" /* 正常だが重要な状態 */
#define KERN_INFO "<6>" /* 情報 */
#define KERN_DEBUG "<7>" /* デバッグレベルのメッセージ */

デフォルトのレベルはKERN_WARNING "<4>"です

使用方法: printk(KERN_INFO"內容");

現在のカーネルの出力レベルを表示する cat /proc/sys/kernel/printk
7 4 1 7
7:コンソールログレベル
4:デフォルトメッセージログレベル
1:最小コンソールログレベル
7:デフォルトのコンソールログレベル

printk関数で使用されるレベルが現在のconsole_loglevelレベルより低い場合は出力できますが、そうでない場合は出力されません。

出力レベルを変更するecho 8 > /proc/sys/kernel/printk

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • Linuxカーネルの動作原理を示す図
  • LED を使って Linux カーネルを使い始める方法を探る

<<:  ログインインターセプションを実装するためのVueルーティング

>>:  Linux システムで MySQL データベースにリモート接続する方法のチュートリアル

推薦する

MySQL における 8 つの一般的な SQL 使用例

序文MySQL は、2016 年もデータベースの人気において力強い成長傾向を維持し続けました。 My...

Linux DHCPサービスの詳細な説明

目次1. DHCP サービス (動的ホスト構成プロトコル) 1. 背景2. 概要3. 利点4.DHC...

HTML+CSS ボックスモデルの例 (円、半円など) 「border-radius」はシンプルで使いやすい

多くの友人は、フロントエンドを学習するときに、ボックス モデルがデフォルトで正方形であることに気付き...

すべてのブラウザとの完全な互換性を実現するために最適なプリセットを選択してください

各ブラウザの select タグのプロパティと各ブラウザのサポートが多少異なるため、各ブラウザでの選...

アイデアコンパイラvueインデントエラー問題シナリオの分析

プロジェクトシナリオ: Vueプロジェクトを実行したらインデントエラーが出ました。ideaコンパイラ...

Webpackを使用して複数ページのプログラムを構築するための実装手順

webpack を使用してシングルページのプログラムを構築することは非常に一般的ですが、実際の開発で...

dockerでPostgreSQLを実行する方法

1. Dockerをインストールします。参考URL: Docker 入門インストールチュートリアル ...

Docker はキューとタスクのスケジューリングを実現するために Laravel アプリケーションをデプロイします

前回の記事では、Docker を使用して Laravel アプリケーションをデプロイする方法について...

Linuxシステムでノードプロセスを実行しているが、プロセスを強制終了できない問題を解決します

まず、Linux システムで実行されているノード プロセスはプロセスを強制終了できないことを紹介しま...

Docker ベースの ELK ログ システムを構築する方法

背景要件:ビジネスがどんどん大きくなると、サーバーの数も増え、さまざまなアクセスログ、アプリケーショ...

単一マシン上での Tomcat の複数インスタンスの実装

1. はじめにまず、1 台のマシンで複数のインスタンスを使用する理由という質問に答える必要があります...

Dockerコンテナ間の通信と外部ネットワーク通信の操作

コンテナ間の通信1. コンテナのネットワーク共有このモードの Docker コンテナはネットワーク ...

NginxはGzipアルゴリズムを使用してメッセージを圧縮します

HTTP圧縮とは場合によっては、比較的大きなメッセージ データがクライアントとサーバー間で送信され、...

FileZilla Server の FTP サーバー構成と 425 エラーおよび TLS 警告の解決策の詳細な説明

123WORDPRESS.COM では、FileZilla のダウンロード リンクを提供しています:...

ミニプログラムは、カスタムのマルチレベル単一選択と複数選択を実装します

この記事では、参考のために、ミニプログラムでカスタムのマルチレベル単一選択および複数選択機能を実装す...