2. 请简述内核模块程序的结构,并根据该结构编写一个内核模块:要求加载模块时内核日志中显示每位同学的学号,卸载时显示“bye-embedded”
时间: 2024-02-24 13:56:01 浏览: 17
内核模块程序的结构一般包含以下几个部分:
1. 头文件:包含所需的头文件,如 `<linux/module.h>`、`<linux/init.h>` 等。
2. 模块信息:定义模块的作者、版本、描述等信息,使用 `MODULE_AUTHOR`、`MODULE_DESCRIPTION` 等宏定义。
3. 模块参数:定义模块的参数,使用 `module_param`、`module_param_array` 等宏定义。
4. 模块加载函数:模块加载时执行的函数,使用 `static int __init 模块名_init(void)` 定义。
5. 模块卸载函数:模块卸载时执行的函数,使用 `static void __exit 模块名_exit(void)` 定义。
一个简单的示例内核模块程序如下:
```c
#include <linux/module.h>
#include <linux/init.h>
static int student_id = 123456; // 学号
module_param(student_id, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
MODULE_PARM_DESC(student_id, "Student ID");
static int __init hello_init(void)
{
printk(KERN_INFO "Hello, %d!\n", student_id);
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, %d!\n", student_id);
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple example Linux module.");
MODULE_LICENSE("GPL");
```
在该示例中,我们定义了一个模块参数 `student_id`,并在加载模块时输出学号,卸载模块时输出“Goodbye, 学号!”的信息。在加载和卸载模块时,内核日志中都会显示相应的信息。
注意,在编写内核模块时,需要使用交叉编译工具链编译成适用于目标平台的格式,并将模块文件拷贝到目标平台上进行加载。