在ubuntu中编写一个内核模块modtest,向外导出两个函数,分别是“求累积和”和“求阶乘”功能。 编写另外两个内核模块module1、module2,分别使用modtest模块中导出的函数,实现计算。注意路径清晰,分别在三个目录下编写
时间: 2024-02-26 11:58:12 浏览: 84
编译内核&模块编程
以下是在 Ubuntu 中编写一个内核模块 `modtest`,向外导出两个函数,分别是“求累积和”和“求阶乘”功能,以及编写另外两个内核模块 `module1`、`module2`,分别使用 `modtest` 模块中导出的函数,实现计算的步骤。
1. 编写 modtest 模块:
在任意目录下创建 modtest.c 文件,并输入以下代码:
```c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
int sum(int n) {
int i, s = 0;
for (i = 1; i <= n; i++) {
s += i;
}
return s;
}
int fact(int n) {
int i, s = 1;
for (i = 1; i <= n; i++) {
s *= i;
}
return s;
}
EXPORT_SYMBOL(sum);
EXPORT_SYMBOL(fact);
static int __init modtest_init(void) {
printk(KERN_INFO "modtest module loaded\n");
return 0;
}
static void __exit modtest_exit(void) {
printk(KERN_INFO "modtest module unloaded\n");
}
module_init(modtest_init);
module_exit(modtest_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Modtest Module");
MODULE_AUTHOR("Your Name");
```
2. 编译 modtest 模块:
在命令行中输入以下命令,编译 modtest 模块:
```bash
make -C /usr/src/linux-headers-$(uname -r) M=$(pwd) modules
```
其中,`/usr/src/linux-headers-$(uname -r)` 是 Linux 内核源代码的路径,`$(pwd)` 表示当前目录。编译成功后,会生成一个名为 `modtest.ko` 的内核模块文件。
3. 编写 module1 模块:
在任意目录下创建 module1.c 文件,并输入以下代码:
```c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
extern int sum(int n);
static int __init module1_init(void) {
int result = sum(10);
printk(KERN_INFO "module1: sum(10) = %d\n", result);
return 0;
}
static void __exit module1_exit(void) {
printk(KERN_INFO "module1 unloaded\n");
}
module_init(module1_init);
module_exit(module1_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Module1");
MODULE_AUTHOR("Your Name");
```
4. 编译 module1 模块:
在命令行中输入以下命令,编译 module1 模块:
```bash
make -C /usr/src/linux-headers-$(uname -r) M=$(pwd) modules
```
编译成功后,会生成一个名为 `module1.ko` 的内核模块文件。
5. 编写 module2 模块:
在任意目录下创建 module2.c 文件,并输入以下代码:
```c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
extern int fact(int n);
static int __init module2_init(void) {
int result = fact(5);
printk(KERN_INFO "module2: fact(5) = %d\n", result);
return 0;
}
static void __exit module2_exit(void) {
printk(KERN_INFO "module2 unloaded\n");
}
module_init(module2_init);
module_exit(module2_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Module2");
MODULE_AUTHOR("Your Name");
```
6. 编译 module2 模块:
在命令行中输入以下命令,编译 module2 模块:
```bash
make -C /usr/src/linux-headers-$(uname -r) M=$(pwd) modules
```
编译成功后,会生成一个名为 `module2.ko` 的内核模块文件。
7. 加载和卸载模块:
在命令行中输入以下命令,分别加载和卸载模块:
```bash
sudo insmod modtest.ko
sudo insmod module1.ko
sudo insmod module2.ko
sudo rmmod module2
sudo rmmod module1
sudo rmmod modtest
```
其中,`sudo insmod` 是加载模块的命令,`sudo rmmod` 是卸载模块的命令。
阅读全文