memory - 在内核模块中,implment的最佳选择是什么?

  显示原文与译文双语对照的内容
0 0

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

现在我有一个'timer_list*',sat'定时器'。 每次我得到新的计时器请求,我就从堆中分配内存,然后在每次分配内存时使用 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("%dn", timer->data);
 kfree(timer);
}

在这种情况下,当我试图打印 timer-> 数据时,我会获得一个分割错误。 因此,当调用回调函数时,分配给timer_list的memoery是否被释放。 在这种情况下,我不需要担心释放内存。

还有什么更好的方法来实现这个。 另外,为了跟踪所有计时器( 就像计时器的存在一样),是否维护类似链接列表的内容,或者有一些内核函数。

时间: 原作者:

0 0

在某种程度上,你必须跟踪所有的计时器。 例如你可以使用挂起计时器的list ( 请参见 list.h ) 。 然后,可以在列表中循环检查是否有计时器已经过期,并释放它的内存( 从列表中删除) 。 在分配新计时器之前,你可以这样做。

因为你可以用 mod_timer() 编程,所以 timer_list 不会自动被释放

原作者:
...