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

Kernel 在内核模块中实现多个计时器的最佳方法是什么,kernel,memory,Kernel,Memory,我正在尝试构建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\u list*定时器;
timer=kmalloc(sizeof(struct timer\u list),GFP\u内核);
设置计时器(计时器,我的回调,(长时间)计时器);
我的回调函数如下所示:

void my_回调(无符号长数据)
{
结构计时器列表*计时器=(结构计时器列表*)数据;
printk(“%d\n”,计时器->数据);
kfree(定时器);
}
在这种情况下,当我试图打印计时器->数据时,我得到了一个分段错误,表示没有该特定地址的页面。那么,当调用回调函数时,分配给timer_list的内存是否被释放。在这种情况下,我不需要担心释放内存

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

void my_callback(无符号长数据)
{
结构计时器列表*计时器=(结构计时器列表*)数据;
printk(“%d\n”,计时器->数据);
kfree(定时器);
}
我不是内核黑客,所以我真的无法建议如何正确操作,但这通常看起来很像:

  • 从整型
    无符号long
    到指针
    struct timer\u list*)
    的相当可疑的类型转换。我假设
    数据
    通常很小,所以您尝试访问
    0
    周围的页面。或者它可以是任意的,因此很可能是未映射的

  • 资源管理出了问题-我还希望
    计时器
    需要某种分配,然后才能
    最终释放它。即使分配和随后的
    printk()
    进行得很顺利(我对此表示怀疑),释放以前未分配的随机内存也会导致崩溃


  • 如果您查看代码的第一部分,我将使用kmalloc()将内存分配给
    timer
    ,并设置回调函数。我正在将
    计时器的地址传递给回调函数。由于回调函数中的
    数据
    计时器
    的地址相同,我可以像
    struct timer\u list*
    一样使用它。哦,好吧,对不起,没有足够耐心地阅读-你能保证
    unsigend long
    至少与
    struct timer\u list*
    相同大小(或者任何指针)?除了编译器似乎做得对之外?顺便说一句,在分配计时器后,在尝试取消引用它之前,为什么不查看计时器的值呢?LDD手册第7章第199页说:
    如果需要在参数中传递多个项,您可以将它们捆绑为单个数据结构,并将指针转换为unsigned long,这是所有受支持体系结构上的一种安全做法,在内存管理中非常常见。我的主要问题是,C将
    long
    指定为至少4字节长。IIRC不能保证它与指针的大小相同(在某些体系结构上为8字节),尽管通常是这样。