实验编号 |
课程设计专题三 |
题目 |
内核模块 |
|
实验目的 |
1.概念 2.相关命令 3.编写 4.编译 5.安装、传参、调试 |
|||
实验内容 |
题目一 编写一个内核模块; 编译该模块; 加载、卸载该模块;
题目二 用内核模块的方式为系统添加一个系统调用 具体要求同专题一 |
|||
报告内容要求 |
(1) 程序实现方法和思路 (2) 测试及结果 |
|||
报 告 正 文 |
||||
(1)内核模块实现的几个步骤: 新建模块目录 用编辑器(vi)编辑源文件 用编辑器编辑Makefile 编译模块
内核模块的加载 #insmod module_name 内核模块的卸载 #rmmod module_name 或者 #modprobe –r module_name 查看系统已经加载的模块 #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
");
8 return 0;
9 }
10
11 static void hello_exit(void) { // 模块退出函数
12 printk("Hello module exit
");
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)
|