实验要求:

题目一 编写一个内核模块; 编译该模块; 加载、卸载该模块;

题目二内核模块的方式为系统添加一个系统调用 具体要求同专题二

提交内容

内核模块加载/卸载截图

评分标准: 至少完成题目一(60-80分) 自主完成题目二(90-100分)

1 内核模块概念

  • 是一段可以 动态加入内核,并且成为内核一部分的代码
  • 优点:
    • 通过动态加载内核模块,使得在运行过程中扩展内核的功能
    • 减小内核映像大小,增加系统灵活性
    • 只需要修改内核,而不必重新编译整个内核

2 内核模块相关命令

  • 加载内核模块:
    • #insmod module_name
  • 卸载内核模块:
    • #rmmod module_name
    • 或者 #modprobe -r module_name
  • 查看系统已经加载的模块:
    • #lsmod
  • 查看系统已经加载的模块信息:
    • #modinfo module_name

3 内核模块的编写,例子

内核模块源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<linux/init.h>			//for module_init()
#include<linux/module.h> //mustbe included
#include<linux/kernel.h> //for printk()

static int hello_init(void){
//模块入口函数
printk("Hello module\n");
return 0;
}

static void hello_exit(void){
//模块退出函数
printk("Goodbye module\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("CHUHUA");
MODULE_DESCRIPTION("hello");

内核模块说明

  • hello_init(): 模块入口函数
    • module_init()宏指定
    • 在模块被加载时被调用
    • 返回值为0:成功,非零则失败
  • hello_exit(): 模块退出函数
    • module_exit()宏指定
    • 在模块被卸载时被调用
    • 作用:清完成资源的清理,被调用完毕后,模块就被卸载了
  • 一个模块至少有 入口 和 退出函数
  • MODULE_LICENSE("GLP"): 设置模块版权信息
  • MODULE_DESCRIPTION(): 描述模块的用途
  • 宏``

4 通过 module 进行内核添加系统调用

参考博客 Linux/Ubuntu18.04 下添加系统调用的两种方法 (内核编译法|模块添加)_Egqawkq的博客-CSDN博客](https://blog.csdn.net/egqawkq/article/details/88970390))