Memory 在内核模块中实现多个计时器的最佳方式是什么

Memory 在内核模块中实现多个计时器的最佳方式是什么,memory,timer,kernel,free,kernel-module,Memory,Timer,Kernel,Free,Kernel Module,我正在尝试构建e内核模块,它将被用户空间程序用来设置计时器。我把它实现为一个字符设备。在内核模块中实现多个计时器的最佳方式是什么 目前我有一个“计时器列表*”,sat“计时器”。每次我收到新的计时器请求时,我都从堆中分配内存,然后每次分配内存时,都使用setup\u timer()和mod\u timer()来设置计时器。但是我只使用了一个指向timer_list结构的指针。但我在这里关心的是,调用回调函数后如何释放分配给“timer”的内存,因为“timer”的当前值可能不指向调用回调函数的结

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

目前我有一个“计时器列表*”,sat“计时器”。每次我收到新的计时器请求时,我都从堆中分配内存,然后每次分配内存时,都使用setup\u timer()和mod\u 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_list的内存是否被释放。在这种情况下,我不需要担心释放内存


还有,有没有更好的方法来实现这一点。此外,为了跟踪所有计时器(如检查是否存在计时器),是否可以维护类似链表的内容,或者是否有一些内核函数来检查这些内容?

在某种程度上,您必须跟踪所有计时器。例如,您可以使用挂起计时器的
列表
(请参阅)。然后,您可以在列表上循环检查是否有计时器已过期,并释放其内存(并从列表中删除)。您可以在分配新计时器之前执行此操作


timer\u list
不会自动释放,因为您可以使用
mod\u timer()

对其重新编程,请参见。我认为您必须将数据从内核复制到用户空间,因为用户空间代码无法访问内核内存。@HannoBinder谢谢,但在您提到的链接上,我没有找到任何东西可以回答我的问题。我想指出一些关于如何在内核和用户空间之间交换数据的参考资料。-愚蠢的问题:kmalloc成功了吗?返回的地址实际上与传递给回调的地址相同吗?我这里的问题是确保分配给指向计时器列表的指针的内存被正确释放。是的,kmalloc工作正常,甚至调用了回调函数,所以kmalloc肯定工作正常。是的,两个地址都是相同的,因为“当我试图打印时,你会遇到一个分段错误”,我想你会想先修复这个问题。这很有帮助!在这种情况下,我不知道为什么我在尝试使用kfree()释放
timer\u list
时会出现分段错误,这取决于您在哪里使用
kfree()
。在您的示例中,您正在使
计时器列表
内存在使用中无效。失败的可能不是
kfree()
,而是在执行
kfree()