编写一个内核模块modtest,向外导出两个函数,分别是“求累积和”和“求阶乘”功能。 编写另外两个内核模块module1、module2,分别使用modtest模块中导出的函数,实现计算。注意路径清晰,分别在三个目录下编写 (2)每个shell命令提示符的用户名必须是自己的名字。
时间: 2024-02-01 11:13:28 浏览: 111
对于第一个问题,可以按照以下步骤编写内核模块:
1. 创建一个名为 modtest 的目录,并在其中创建以下文件:
```
modtest/
├── Makefile
├── modtest.c
└── modtest.h
```
2. 在 modtest.h 文件中定义导出函数的原型:
```c
#ifndef __MODTEST_H__
#define __MODTEST_H__
int sum(int n);
int factorial(int n);
#endif
```
3. 在 modtest.c 文件中实现导出函数:
```c
#include "modtest.h"
int sum(int n)
{
int i, s = 0;
for (i = 1; i <= n; i++) {
s += i;
}
return s;
}
int factorial(int n)
{
int i, f = 1;
for (i = 1; i <= n; i++) {
f *= i;
}
return f;
}
```
4. 在 Makefile 文件中编写编译规则:
```makefile
obj-m := modtest.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
```
5. 在 modtest 目录下运行 make 命令编译内核模块。
6. 创建 module1 和 module2 目录,并在其中创建以下文件:
```
module1/
├── Makefile
├── module1.c
└── modtest.h
module2/
├── Makefile
├── module2.c
└── modtest.h
```
7. 在 module1.c 和 module2.c 中分别使用 modtest 模块中的函数:
```c
#include <linux/module.h>
#include "modtest.h"
static int __init module1_init(void)
{
int n = 10;
printk(KERN_INFO "module1: sum(%d) = %d\n", n, sum(n));
return 0;
}
static void __exit module1_exit(void)
{
printk(KERN_INFO "module1: exit\n");
}
module_init(module1_init);
module_exit(module1_exit);
MODULE_LICENSE("GPL");
```
```c
#include <linux/module.h>
#include "modtest.h"
static int __init module2_init(void)
{
int n = 5;
printk(KERN_INFO "module2: factorial(%d) = %d\n", n, factorial(n));
return 0;
}
static void __exit module2_exit(void)
{
printk(KERN_INFO "module2: exit\n");
}
module_init(module2_init);
module_exit(module2_exit);
MODULE_LICENSE("GPL");
```
8. 在 module1 和 module2 目录下分别运行 make 命令编译内核模块。
9. 在 Linux 系统中加载 modtest、module1、module2 内核模块,即可在系统日志中看到输出信息。
对于第二个问题,可以通过修改 PS1 环境变量来实现:
```bash
export PS1='\u@\h:\w\$ '
```
将上述命令添加到 ~/.bashrc 文件中,即可每次打开终端时都显示用户名。
阅读全文