オペレーティングシステムの設計カーネルモジュールのコース

実験No.

第三のためのテーマ別カリキュラムを設計

タイトル

カーネルモジュール

実験の目的

1.コンセプト

2.関連コマンド

3.書き込み

4.コンパイル

5.インストール、パラメータ渡し、デバッグ

ウェブテスト

トピック

カーネルモジュールを書きます。

モジュールをコンパイルします。

モジュールをアンロード、ロード、

 

トピック2

カーネルモジュールとシステムのシステム・コールを追加します

テーマとした具体的な要件

レポートの内容の要件

(1)プログラムは、方法やアイデアを実装します

(2)テストおよび結果

レポートテキスト

 

工程(1)カーネルモジュールを実装。

新しいモジュールディレクトリ

(VI)のソースファイルを編集するためのエディタ

エディタでMakefileを編集します

モジュールをコンパイルします

 

  ロードされたカーネルモジュール

#insmodモジュール名

カーネルモジュールをアンロード

      #rmmodモジュール名  

  若しくは

      #modprobe -rモジュール名

システムがロードされたモジュールを見ます

      #lsmod

システム、すでにロードされたモジュールの情報を見ます

      #modinfo

 

 1 //hello.c
 2 #include <linux/init.h>                      // for module_init()
 3 #include <linux/module.h>              // must be include
 4 #include <linux/kernel.h>                // for printk()
 5  
 6 static int hello_init(void) {               // 模块入口函数
 7     printk("Hello world\n");
 8     return 0;
 9 }
10  
11 static void hello_exit(void) {           // 模块退出函数
12     printk("Hello module exit\n");
13 }
14  
15 module_init(hello_init);
16 module_exit(hello_exit);
17 MODULE_LICENSE("GPL");
18 MODULE_AUTHOR("kuy");
19 MODULE_DESCRIPTION("hello");

 

  说明:

模块入口函数为hello_init(),由module_init()宏指定,在模块被加载的时候被调用向系统注册。

入口函数的返回值:0表示成功,非0表示失败。

模块的退出函数为hello_exit(),由module_exit()宏指定,在模块被卸载时被调用向系统注销,主要来完成资源的清理工作。它被调用完毕后,就模块就被内核清除了。

一个模块最少需要有入口和退出函数。

 

printk( )函数

printk 函数在Linux内核中定义并且对模块可用,为内核提供日志功能,记录内核信息或用来给出警告。与标准C 库函数 printf 的行为相似。

每个printk()声明都会带一个优先级。内核总共定义了八个优先级的宏, 在linux/kernel.h中定义。若不指明优先级,DEFAULT_MESSAGE_LOGLEVEL这个默认优先级将被采用。

信息添加到文件/var/log/kern.log,可直接查看,或者用命令dmesg查看。在X-windows下的终端insmod一个模块,日志信息只会记录在日志文件中,而不在终端打印。

 

内核模块的Makefile

obj-m := hello.o

KERNELDIR := /lib/modules/$(shell uname –r)/build

PWD := $(shell pwd)

modules:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

 

clean:

rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

(2)

 

 

 

おすすめ

転載: www.cnblogs.com/ku1274755259/p/11108895.html