Linux 内核模块:printk 消息不是我希望在缓冲区日志中的位置

补丁85

这个问题与实验室/家庭作业有关。我们被要求学习如何加载和删除内核模块,然后修改已提供的内核模块中的 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 Module\n");

    /* 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 %d\n", 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 Module\n");  

    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 内核和内核模块作为课程材料和教科书的一部分提供。

任何帮助是极大的赞赏!

尼基塔·尤先科

这是因为您在 printk 的末尾错过了 '\n'。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Linux内核模块中设置定期计时器回调

来自分类Dev

CLI指令未在Linux内核模块中执行

来自分类Dev

如何在Linux内核模块中分配由1GB HugePages支持的DMA缓冲区?

来自分类Dev

Linux内核模块:套接字缓冲区(sk_buff-> len)不确定行为

来自分类Dev

在linux 2.6内核模块中替代waitpid的好选择?

来自分类Dev

将自定义库链接到Makefile中的Linux内核模块

来自分类Dev

如何使用Linux内核模块中的Linux系统调用

来自分类Dev

是否可以在CLion中开发linux内核模块?

来自分类Dev

如何在Linux中禁用内核模块签名

来自分类Dev

Linux内核模块在卸载过程中挂起

来自分类Dev

在Linux内核模块中实现民意测验

来自分类Dev

Linux内核模块在另一个模块中调用函数

来自分类Dev

如何使用Linux内核模块中的地址转储/列出所有内核符号?

来自分类Dev

linux内核模块的缺点?

来自分类Dev

无法打印从用户空间C应用程序发送到linux内核模块的消息

来自分类Dev

我的Linux内核模块未收到正确的用户空间应用程序PID

来自分类Dev

linux内核模块的缺点?

来自分类Dev

在Linux内核模块之间共享缓冲区,导致“无法处理虚拟地址XXXXX上的内核页面调度请求”

来自分类Dev

如何在Linux的当前内核中添加未编译的内核模块

来自分类Dev

为什么要修改linux内核而不是创建内核模块?

来自分类Dev

在Linux内核模块中刷新CPU数据缓存

来自分类Dev

Linux内核模块在另一个模块中调用函数

来自分类Dev

安装Linux内核模块

来自分类Dev

printk 的 Linux 内核模块错误:格式参数太多

来自分类Dev

linux内核模块中的浮点运算(再次)

来自分类Dev

如何延迟 Linux 内核模块临界区

来自分类Dev

linux内核模块中的Write函数被重复调用

来自分类Dev

D 中的内核模块

来自分类Dev

如何在 Yocto 中彻底重建 Linux 内核模块?

Related 相关文章

  1. 1

    如何在Linux内核模块中设置定期计时器回调

  2. 2

    CLI指令未在Linux内核模块中执行

  3. 3

    如何在Linux内核模块中分配由1GB HugePages支持的DMA缓冲区?

  4. 4

    Linux内核模块:套接字缓冲区(sk_buff-> len)不确定行为

  5. 5

    在linux 2.6内核模块中替代waitpid的好选择?

  6. 6

    将自定义库链接到Makefile中的Linux内核模块

  7. 7

    如何使用Linux内核模块中的Linux系统调用

  8. 8

    是否可以在CLion中开发linux内核模块?

  9. 9

    如何在Linux中禁用内核模块签名

  10. 10

    Linux内核模块在卸载过程中挂起

  11. 11

    在Linux内核模块中实现民意测验

  12. 12

    Linux内核模块在另一个模块中调用函数

  13. 13

    如何使用Linux内核模块中的地址转储/列出所有内核符号?

  14. 14

    linux内核模块的缺点?

  15. 15

    无法打印从用户空间C应用程序发送到linux内核模块的消息

  16. 16

    我的Linux内核模块未收到正确的用户空间应用程序PID

  17. 17

    linux内核模块的缺点?

  18. 18

    在Linux内核模块之间共享缓冲区,导致“无法处理虚拟地址XXXXX上的内核页面调度请求”

  19. 19

    如何在Linux的当前内核中添加未编译的内核模块

  20. 20

    为什么要修改linux内核而不是创建内核模块?

  21. 21

    在Linux内核模块中刷新CPU数据缓存

  22. 22

    Linux内核模块在另一个模块中调用函数

  23. 23

    安装Linux内核模块

  24. 24

    printk 的 Linux 内核模块错误:格式参数太多

  25. 25

    linux内核模块中的浮点运算(再次)

  26. 26

    如何延迟 Linux 内核模块临界区

  27. 27

    linux内核模块中的Write函数被重复调用

  28. 28

    D 中的内核模块

  29. 29

    如何在 Yocto 中彻底重建 Linux 内核模块?

热门标签

归档