在内核模块中实现多个定时器的最佳方法是什么

时间:2013-10-09 14:40:18

标签: kernel memory

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

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

所以,我考虑将结构的地址作为参数传递给回调函数,然后在该地址上调用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->数据表示该特定地址没有页面时,我遇到了分段错误。因此,当调用回调函数时,是否释放了分配给timer_list的memoery。在那种情况下,我不必担心释放内存。

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

1 个答案:

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