最初のカーネルモジュールの作成


カーネルモジュールはLinuxカーネルが外部に提供するインタフェースです.全称は動的ローディング可能カーネルモジュール(Loadabkle Kernel Module,LKM)である.Linuxカーネルがモジュールメカニズムを提供するのは、それ自体が単一カーネルであるためである(monolithic kernel).単一カーネルの最大の利点は、すべてのコンテンツが統合されているため効率が高いことですが、拡張性とメンテナンス性が相対的に悪いという欠点があり、モジュールメカニズムはこの欠陥を補うためです.
 
一、モジュールとは何か
モジュールは独立した機能を持つプログラムで、単独でコンパイルできますが、独立して実行することはできません.実行時にカーネルにリンクされ、カーネルの一部としてカーネル空間で実行されます.これは、ユーザー空間で実行されるプロセスとは異なります.モジュールは、通常、ファイルシステム、ドライバ、またはカーネル内の他の上位機能を実現するために使用される関数およびデータ構造のセットから構成されます.
二、簡単なモジュールを作成する
モジュールとカーネルはカーネル空間で動作し、モジュールプログラミングは一定の意味でカーネルプログラミングである.カーネルバージョンが変化するたびに、一部の関数名も変化するため、モジュールプログラミングはカーネルバージョンと密接に関連しています.
 
最初のカーネルモジュール:
カーネルバージョン:2.6.31-4 RedFlag 6.0でテストに合格
 
/*
 * hellomod.c
 *        
 * author:cm
 * date:2010-3-28
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

static int __init lkp_init(void)
{
    printk("<1>Hello,Kernel! from the kernel space...
"); return 0; } static void __exit lkp_cleanup(void) { printk("<1>Goodbye,Kernel! leaving the space...
"); } module_init(lkp_init); module_exit(lkp_cleanup); MODULE_LICENSE("GPL");

説明:
8~10行の必要なヘッダファイル
すべてのモジュールはヘッダファイルmoduleを使用します.h、このファイルを含める必要があります.ヘッダファイルhは、一般的なカーネル関数を含む.
ヘッダファイルhはマクロを含むinitと_exitは、カーネルが使用するメモリを解放できます.
 
12~16行
これは、コンパイルするコード、データ構造の初期化などの内容を含むモジュールの初期化関数です.
printk()関数カーネルで定義され、Cライブラリのprintf()と同様に印刷する情報を端末やシステムログに出力します.文字列の<1>は出力のレベルであり、直ちに端末で出力されることを示す.
 
18~21行
これはモジュールの終了とクリーンアップ関数です.ここでは、ドライバの終了時に関連するすべてのクリーンアップを行うことができます.
 
23~24行
関数module_init()とmodule_exit()はモジュールプログラミングにおいて最も基本的で必須の2つの関数である.module_Init()カーネル登録モジュールに提供される新しい機能、module_exit()モジュールが提供する機能をログアウトします.
module_Init()はドライバ初期化のエントリポイントです.内蔵モジュールの場合、カーネルは起動時にエントリポイントを呼び出す.ロード可能モジュールの場合は、そのモジュールがカーネルを挿入したときに呼び出され、モジュールをアンインストールしたときにmodule_が呼び出されます.exit()関数.
 
25行
GNUパブリックライセンス(必須)
コンパイル
 
コンパイルツール:gcc make
Makefileファイル:
#Makefile2.6
obj-m += hellomod.o #  hellomod       
CURRENT_PATH := $(shell pwd) #         
LINUX_KERNEL := $(shell uname -r) #    
#          (RedFlag 6.0)
LINUX_KERNEL_PATH := /usr/src/kernels/2.6.31-4-i686
all:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #    
clean:
	rm -rf *.mod.c *.o *.ko *.markers *.symvers *.order #   

makeコマンドを実行すると、.o.koファイルなどのモジュール関連ファイルが自動的に生成されます.
 
モジュールをカーネルに挿入
[root@localhost module]# insmod hellomod.ko
 
挿入に成功したら、dmesgコマンドでこのモジュールが実行した表示内容を表示できます.
[root@localhost module]# dmesg
 
...
Hello,Kernel! from the kernel space...
 
モジュールのアンインストール
[root@localhost module]# rmmod hellomod
 
dmesg表示の再実行
Hello,Kernel! from the kernel space... Goodbye,Kernel! leaving the space...
 
注意:表示(dmesg)は実はログを見るので、ログを見る方法であればすべてできるはずです.例えば、tail/var/log/messages