モジュールをカーネルにロードする方法


モジュールの動的ロード、アンインストールをサポートするには、カーネルをコンパイルするときに注意してください.「Lodable Module Support」の適切なオプションを選択します.たとえば、ロードモジュールをサポートするには、Enable loadable module supportを選択します.アンインストールモジュールをサポートするにはModule unloadingを選択します.強制アンインストールモジュールをサポートするには、Forced module unloadingを選択します.
1, When the kernel needs a feature that is not resident in the kernel, the kernel module daemon kmod (In earlier versions of linux, this was known as kerneld) execs
modprobe to load the module in. modprobe is passed a string in one of two forms:
  • A module name like softdog or ppp.
  • A more generic identifier like char-major-10-30

  • mdoprobeに渡すパラメータがモジュール名の場合、加算する必要はない.koの拡張子modprobeに渡されるのが汎用フラグである場合、modprobeはetc/modprobeを表示する.confは、汎用フラグに対応するモジュール名を知る.
    modprobe.confファイルはリリース版に固有です.例えば、私のUbuntuではmodprobeが/etc/modprobeを表示します.d/aliasesは、汎用フラグをモジュール名に変換する.
    2、モジュールにも依存性の問題があることに注意してください.例えば、msdosをロードします.ko、fatを先にロードする必要がある.ko. modprobeは/lib/moduule/version/modulesを表示します.depはモジュールの依存関係を知る.(version = uname -r). moules.depは$
    depmod-aコマンド作成.
    他のモジュールに依存するモジュールを「stacking modules」と呼びます.
    3,依存関係を知る後,mprobeはprerequisitesモジュールを先にロードし,モジュール自体をロードする.実際、modprobeはinsmodを呼び出すことでこれらのモジュールをロードします!
    モジュールをロードする方法は2つあります.さっきのmsdosで.koは例です.
    $ insmod /lib/modules/version/kernel/fs/fat/fat.ko
    $ insmod /lib/modules/version/kernel/fs/msdos/msdos.ko

    $ modprobe msdos
    modprobeとinsmodの違い:
    1,modprobeはカーネルモジュールのデフォルトの存在ディレクトリ(/lib/modules/version/)を知っているがinsmodは知らない.
    2 modprobeを呼び出す場合、モジュール名(代入せず、ko拡張)を与えるだけで、insmodは完全なパスとモジュール名を与える必要がある.
    3,modprobeは依存性を自動的に解決する.Insmodは、カーネルをロードする前後の順序を指定する必要がある.
    4 modprobeは、ロードするモジュールがデフォルトディレクトリにあると仮定するため、デフォルトディレクトリ以外のモジュールをロードするにはinsmodを呼び出す.
    リリース版ではmodprobe,insmod,depmodをパッケージ化し、Linuxカーネルモジュール管理ツールと呼ばれ、2.4または以前のカーネルに対してmodutils、2.6はmodule-init-toolsと呼ばれている.
    を通じて
    lsmodは、カーネルにロードするモジュール情報も/proc/modulesファイルの内容も表示できる.実際、lsmod読み取りコマンドは、/proc/modulesの内容を表示することによってモジュール情報を表示する.
    モジュールのアンインストール
    $の使用
    sudo rmmod mod_nameはモジュールをアンインストールすることができる.ただし、カーネルはモジュールのアンインストールが安全ではないと判断する場合があります.$
    sudo rmmod -f mod_モジュールを強制的にアンインストールするname.
    ここでは、モジュールのロード、アンインストールのコマンド、モジュールのロード、アンインストールの原理について説明します.参考「モジュール実行環境」
    準備作業
    モジュールは、現在実行中のカーネルにロードするもよいし、別の未実行のカーネルにロードしてもよい.ここでは、モジュールを起動するカーネルにロードすることのみを一時的に考慮する.
    モジュールのプログラミングを勉強して、まずカーネルを再コンパイルして、どうしてカーネルをコンパイルしますか?理由は2つあります.
    1,Linuxリリースのカーネルはkernel向けです.orgの公式カーネルには多くのパッチが追加されており、提供されるカーネルヘッダファイルは完全ではなく、カーネルAPIも修正される可能性がある.モジュールのプログラミングを学ぶには、公式カーネルコンパイルを使用することが望ましい.
    2,リリース版のカーネルでは、一般的にデフォルトのCONFIG_MODVERSIONSはyに設定されています.これにより、モジュールのロード時にバージョンの問題で失敗するため、CONFIGを設定しないはずです.MODVERSIONS.
    リファレンス
    カーネルモジュールプログラミングの_初窥门径
    モジュールプログラム構成
    モジュールプログラムの設計はアプリケーションの設計に似ている:少なくともモジュールプログラムにはentry pointとexit pointがある.モジュールのプログラムコードは独立したファイルに存在する.
    モジュールプログラムの構成を見てみましょう.
    モジュールプログラムには少なくとも2つの関数が必要である:1つの初期化関数は、モジュールがカーネルにロードされたときに呼び出され、1つの終了関数(clean_up)は、モジュールがアンインストールされたときに呼び出される.
    上記の2つの関数を定義する方法は2つありますが、後の定義方法をお勧めします.
    int init_module(void){ ...}void cleanup_module(void){ ...}
    バージョン2.3.13以降のカーネルは、次の方法で定義できます.
    static int hello_start(void){ ...}static void hello_end(void){ ...}module_init(hello_start);module_exit(hello_end);
    1,初期化関数と終了関数の定義.
    初期化関数と終了関数は、次のような形式でなければなりません.
    static int funname_init(void);/*モジュールがロードされたときに呼び出されます*/
    static void funname_exit(void);/*モジュールがアンインストールされたときに呼び出されます*/
    これらの関数は外部に出力ので、static限定符号を付けるのが一般的である.
    2, module_initとmodule_exitマクロ
    funname_init()はmodule_を通りますInit()はモジュールのentry pointとして登録する.同様に、funname_exit()module経由exit()マクロはモジュールのexit pointとして登録する.注:ファイルが静的カーネルイメージにコンパイル場合、終了関数は実行されません.
    これらのマクロ拡張は、対応する関数定義の後にある必要があります.
    3,著作権情報
    バージョン2.4のカーネルから、モジュールの著作権情報を宣言するためにいくつかのマクロを使用できます.
    MODULE_LICENSE()マクロ:
    括弧の内容は、次の形式で指定できます.
    "GPL"	                    [GNU Public License v2 or later]
    "GPL v2" [GNU Public License v2]
    "GPL and additional rights" [GNU Public License v2 rights and more]
    "Dual BSD/GPL" [GNU Public License v2 or BSD license choice]
    "Dual MPL/GPL" [GNU Public License v2 or Mozilla license choice]
    "Proprietary" [Non free products]
    MODULE_の場合LICENSE(「Proprietary」)では、あなたが作成したモジュールは無料ではありません.カーネルコミュニティはそれを「汚染」したカーネルと見なし、関連するバグレポートを無視します.また、GPLに従わないモジュールではGPLのみのシンボルを呼び出すことはできません(「出力シンボル」の内容を参照).
    二重著作権を宣言する場合、LinuxではGPLとして宣言する効果と同じである.すなわち、LinuxはGPL著作権だけを気にする.
    また、MODULE_DESCRIPTION()はモジュールの機能を説明する.MODULE_AUTOR()記述モジュールの作成者;  and MODULE_SUPPORTED_DEVICE()は、モジュールがサポートするデバイスのタイプを宣言する.
    カーネルソースツリーの/include/linux/module.hで著作権マクロを定義する.これらのマクロは一般的にファイルの最後に位置する.
    4、ヘッダファイルを含む.
    モジュールプログラムの先頭にヘッダファイルを含める必要があります.
    #include <linux/module.h>	/*   */
    #include <linux/kernel.h>	/*  ,  */
    #include /*マクロを する は*/