操作系统课程设计 内核模块

实验编号

课程设计专题三

题目

内核模块

实验目的

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\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)

 

 

 

posted @ 2019-06-30 10:26  库妍  阅读(419)  评论(0编辑  收藏  举报