実験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
おすすめ
ランキング