Linux カーネル デバイス ドライバー Linux カーネル モジュールの読み込みメカニズム メモの概要

Linux カーネル デバイス ドライバー Linux カーネル モジュールの読み込みメカニズム メモの概要

#include <linux/moduleparam.h>

1. モジュールパラメータ

ドライバー内の変数の定義

static int num = 0; //ロードモジュールがnumの値を指定しない場合は0になります
  • module_param(変数名、型、権限); 型: byte、int、uint、short、ushort、long、ulong、bool、charp、権限には書き込み権限を設定できません
  • パラメータを渡す: insmod test.ko 変数名 1 = 値 1 変数名 2 = 値 2

module_param の呼び出し関係は次のとおりです。

#define module_param(名前、タイプ、権限) \
module_param_named(名前、名前、タイプ、権限)
#define module_param_named(名前、値、タイプ、パーミッション) \
param_check_##type(名前、&(値)); \
module_param_call(名前、param_set_##type、param_get_##type、&value、perm); \
__MODULE_PARM_TYPE(名前、#タイプ)
#define module_param_call(名前、設定、取得、引数、パーマ) \
__module_param_call(MODULE_PARAM_PREFIX、\
  名前、設定、取得、引数、\
  __same_type(*(arg), bool), perm)
#define __module_param_call(プレフィックス、名前、設定、取得、引数、isbool、パーマ) \
静的 int __param_perm_check_##name __attribute__((未使用)) = \
BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2)) \
+ BUILD_BUG_ON_ZERO(sizeof(""プレフィックス) > MAX_PARAM_PREFIX_LEN); \
静的const char __param_str_##name[] = プレフィックス #name; \
静的構造体 kernel_param __moduleparam_const __param_##name \
__使用済み \
  __attribute__ ((未使用、__section__ ("__param")、aligned(sizeof(void *)))) \
= { __param_str_##name、perm、isbool ? KPARAM_ISBOOL : 0、\
  設定、取得、{ 引数 } }

複数の c ファイルをモジュールにコンパイルできます。これは、次のように Makefile xxx-objs の指示を使用して実現できます。

test-objs := ao bo // ac と bc から test.ko にコンパイルします。ターゲット ko ファイルと同じ名前の .o ファイルは存在しないことに注意してください。obj-m += test.o

システム内のモジュール情報は、/sys/module/モジュール名/で確認できます。

1. elfファイルの情報を表示する

readelf test.ko -a

Koファイルの構成

  • 1. elfファイルヘッダー
  • 2. テキストデータ...
  • 3. セクションテーブル
  • 4. 記号表

2. EXPORT_SYMBOL(関数名/変数アドレス) //関数または変数のアドレスをカーネルシンボルテーブルにエクスポートします

EXPORT_SYMBOL_GPL(関数名)
///////////

/proc/kallsyms 現在のシステムのシンボルテーブルを表示する

要約する

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

以下もご興味があるかもしれません:
  • Linux コードを Windows に移植する簡単な方法
  • Linux カーネル デバイス ドライバーのメモリ管理に関する注意事項
  • Linux カーネル デバイス ドライバー カーネル時間管理に関する注意事項
  • Linux カーネル デバイス ドライバー キャラクタ デバイス ドライバー ノート
  • Linux カーネル デバイス ドライバー仮想ファイル システムに関する注意事項
  • Linux カーネル デバイス ドライバー システム コールに関する注意事項
  • Linux カーネル デバイス ドライバー カーネル デバッグ テクニカル ノート集
  • Linux カーネル デバイス ドライバー カーネル リンク リストの使用上の注意
  • Linux カーネル デバイス ドライバー proc ファイル システム ノート
  • Linux カーネル デバイス ドライバー 高度な文字デバイス ドライバーのメモ
  • Linux カーネル デバイス ドライバー アドレス マッピングに関する注意事項
  • Linux カーネル デバイス ドライバー Linux カーネル 基本メモの概要
  • 新しいカーネルをLinuxシステムに移植する手順

<<:  MySQL 5.5 で範囲パーティションを追加および削除する例

>>:  cmd と python での MySQL の一般的な操作についての簡単な説明

推薦する

40以上の美しいWebフォームデザイン例

Web フォームは、訪問者と Web サイト所有者間の主要なコミュニケーション チャネルです。フィー...

グローバルトーストコンポーネントをカプセル化するVueの完全な例

目次序文1. vue-cliを使う1. Toastコンポーネントを定義する2. main.jsで設定...

MySQL ロック(テーブルロック、行ロック、共有ロック、排他ロック、ギャップロック)の詳細な説明

現実世界では、鍵は外の世界から身を隠したいときに使用するツールです。コンピュータでは、複数のプロセス...

MYSQL スロークエリとログ設定とテスト

1. はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメン...

nginx で第 3 レベルドメイン名を設定する方法の例

問題の説明nginx を設定することで、異なるポートを介して異なる Web アプリケーションにアクセ...

Linux CentOS MySQL データベースのインストールと設定のチュートリアル

MySQLデータベースのインストールに関するメモ、みんなで共有a) MySQL ソースインストールパ...

Spring環境を構成するためのDocker-composeの手順

最近、メンバーがテストできるようにプロジェクトをパッケージ化する必要がありますが、パッケージ化された...

Centos8でdockerがインストールできない問題の解決方法

問題 [root@zh ~]# [root@zh ~]# [root@zh ~]# yum -y d...

CSS でフローティングにより親要素の高さが崩れる問題を解決するいくつかの方法

1. ドキュメントフローとフローティング1. ドキュメントフローとは何ですか? HTML では、ドキ...

MySQLテーブルパーティショニングプログラムを変更する方法

MySQLテーブルパーティショニングプログラムを変更する方法1. サブテーブルの実装の原則は次のとお...

react-color を使用してフロントエンドのカラーピッカーを実装する方法

背景次の図に示すように、 react-color を使用してフロントエンド インターフェースのカラー...

Linux で MySQL スケジュール タスク バックアップ データを実装する方法

序文バックアップは災害復旧の基礎であり、システム操作エラーやシステム障害によるデータ損失を防ぐために...

Ubuntu 16.4 で完全に分散された Hadoop 環境を構築するための実践的なチュートリアル

序文この記事は主にubantu 16.4 Hadoop完全分散構築に関する関連コンテンツを紹介し、皆...

Alibaba Cloud サーバーの購入とインストール方法

1. サーバーを購入するこの例では、購入したサーバーはAlibaba Cloudです。大学生はAli...

Mybatis での動的 SQL ステートメント分析

この記事は主にMybatisでの動的SQL文の解析について紹介します。この記事のサンプルコードは非常...