【问题标题】:What is the best way to implement multiple timers in kernel module在内核模块中实现多个计时器的最佳方法是什么
【发布时间】:2013-10-17 14:39:24
【问题描述】:

我正在尝试构建 e 内核模块,用户空间程序将使用它来设置计时器。我将它作为一个字符设备来实现。在内核模块中实现多个定时器的最佳方式是什么?

目前我有一个'timer_list*',坐在'timer'。每次收到新的计时器请求时,我都会从堆中分配内存,然后每次分配内存时使用 setup_timer() 和 mod_timer() 设置计时器。但我只使用一个指向 timer_list 结构的指针。但我在这里担心的是,一旦调用回调函数,如何释放分配给“定时器”的内存,因为“定时器”的当前值可能未指向调用回调函数的结构。

所以,我考虑将结构的地址作为参数传递给回调函数,然后在该地址上调用 kfree()。

struct timer_list *timer;
timer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
setup_timer(timer, my_callback, (unsigend long)timer);

我的回调函数如下所示:

void my_callback (unsigned long data)
{
      struct timer_list *timer = (struct timer_list*)data;
      printk("%d\n", timer->data);
      kfree(timer);
}

在这种情况下,当我尝试打印 timer->data 表示该特定地址没有页面时,我遇到了分段错误。那么,当调用回调函数时,分配给 timer_list 的内存是否被释放。在那种情况下,我不需要担心释放内存。

另外,有没有更好的方法来实现这个东西。此外,要跟踪所有计时器(例如检查是否存在计时器),是否可以维护类似链表之类的东西,或者有一些内核函数来检查它?

【问题讨论】:

    标签: kernel memory


    【解决方案1】:
    void my_callback (unsigned long data)
    {
        struct timer_list *timer = (struct timer_list*)data;
        printk("%d\n", timer->data);
        kfree(timer);
    }
    

    我不是内核黑客,所以我真的无法建议如何正确地做到这一点,但这通常看起来像:

    1. 从整数类型unsigned long 到指针struct timer_list *) 的相当可疑的类型转换。我假设data 通常很小,所以你试图访问0 周围的页面。或者它可以是大部分随机的,因此很可能是未映射的。

    2. 资源管理出错 - 我还希望 timer 需要某种分配,然后才能在最后 free 它。即使分配和随后的printk() 进展顺利(我对此表示怀疑),释放之前未分配的随机内存也会导致崩溃。

    【讨论】:

    • 如果您查看代码的第一部分,我正在使用 kmalloc() 将内存分配给 timer 并设置回调函数。我将timer 的地址传递给回调函数。由于回调函数中的datatimer的地址相同,所以我可以像struct timer_list*一样使用它
    • 哦,好吧,抱歉,没有足够耐心地阅读 - 您是否可以保证 unsigend long 至少与 struct timer_list* 大小相同(或任何指针)?除了编译器似乎做得对吗?顺便说一句,你为什么不printk()timer 的值来查看它指向的位置,然后再分配它并尝试取消引用它?
    • LDD 书第 7 章第 199 页说:If you need to pass multiple items in the argument, you can bundle them as a single data structure and pass a pointer cast to unsigned long, a safe practice on all supported architectures and pretty common in memory management
    • 好吧,我的主要问题是,C 将long 指定为至少 4 个字节长。 IIRC 不能保证它与指针的大小相同(在某些架构上为 8 个字节),尽管通常是这种情况。
    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多