2

我正在尝试构建 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 的内存是否被释放。在那种情况下,我不需要担心释放内存。

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

4

1 回答 1

0
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()进展顺利(我对此表示怀疑),释放随机的、以前未分配的内存也会导致崩溃。

于 2013-10-09T21:53:45.193 回答