这个问题与实验室/家庭作业有关。我们被要求学习如何加载和删除内核模块,然后修改已提供的内核模块中的 C 代码。我们必须定义一个结构,其中包含一些要插入到链表中的元素。然后我们必须使用链表中的数据通过 printk(( 打印一些消息。
这是我的代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/list.h>
#include <linux/types.h>
/*Defines a struct containing the elements that are to be
inserted in the linked list*/
struct birthday{
int day;
int month;
int year;
struct list_head list;
};
/*Declares a list_head object */
static LIST_HEAD(birthday_list);
/* This function is called when the module is loaded. */
int simple_init(void) {
/* Create and initialize instances of struct birthday*/
struct birthday *person, *ptr;
int count;
printk(KERN_INFO "Loading Modulen");
/* This loop populates the linked list with 5 nodes,
* each with different birthday data*/
for (count = 0; count < 5 ; count++){
person = kmalloc(sizeof(*person), GFP_KERNEL);
person -> day = count + 2;
person -> month = 11 - (count + 2);
person -> year = 1985 + ((count + 1) * 3);
INIT_LIST_HEAD(&person -> list);
list_add_tail(&person -> list, &birthday_list);
}
/*Traverse the list*/
list_for_each_entry(ptr, &birthday_list, list) {
printk(KERN_INFO "Birthday: Month %d Day %d Year %dn", ptr -> month, ptr -> day, ptr -> year);
}
return 0;
}
/* This function is called when the module is removed. */
void simple_exit(void) {
struct birthday *ptr, *next;
printk(KERN_INFO "Removing Modulen");
list_for_each_entry_safe(ptr, next, &birthday_list, list){
printk(KERN_INFO "Removing %d %d %d", ptr->month, ptr->day, ptr->year);
list_del(&ptr -> list);
kfree(ptr);
}
}
/* Macros for registering module entry and exit points. */
module_init( simple_init );
module_exit( simple_exit );
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple Module");
MODULE_AUTHOR("SGG");
我可以毫无错误地编译代码,而且它似乎可以很好地加载和删除。我的问题是打印的报表。当我加载模块并使用 dmesg 检查日志缓冲区时,我可以看到所有 5 条消息(链表中的每个节点一条(。当我删除模块并检查日志缓冲区时,我只看到 4 条消息。与链表中第 5 个节点关联的消息此时不会打印。如果我随后再次加载模块,然后检查日志缓冲区,则第一条消息是删除模块时应该在日志中的消息。
当我有 5 个节点时,我只遇到了这个问题。如果我将循环更改为创建 10 个节点,则所有消息都会按预期打印。6 个节点或 4 个节点也是如此。但是每次我创建 5 个节点时都会遇到这个问题。
这是我的输出:我的命令行输出屏幕截图
此分配的所有编辑和操作都在Windows 10中运行的Oracle VM VirtualBox中完成。我正在修改的 Linux 内核和内核模块作为课程材料和教科书的一部分提供。
任何帮助将不胜感激!
这是因为您在打印结束时错过了""。