如何创建一个泛型函数来将哈希表名称和结构作为内核模块中的参数?

时间:2016-10-14 10:15:33

标签: hashtable kernel-module

我目前正在编写一个内核模块,它使用多个哈希表来存储不同的结构。我将如何实现一个通用函数,该函数将哈希表名称,哈希键和结构存储为参数并执行相应的存储操作? 这是我的哈希表和结构定义。

static DEFINE_HASHTABLE(count, 7);
struct mystruct {
    int data ;
    struct hlist_node my_hash_list ;
};

这是我的商店代码(如果我直接递增temp->数据而不是做我的回旋加法和del方式,我似乎得到一个空指针错误:()

struct mystruct *temp;
struct mystruct *first;
temp = kmalloc(sizeof(struct mystruct),GFP_KERNEL);
first = kmalloc(sizeof(struct mystruct),GFP_KERNEL);
hash = command;
hash_for_each_possible(count, temp, my_hash_list,hash){
    first->data=temp->data+1;
    printk("Count: %d\n",first->data);
    hash_add(count, &(first->my_hash_list), hash);      
    hash_del(&(temp->my_hash_list));                    
    return;
}
first->data=1;                                              
hash_add(count, &(first->my_hash_list), hash);

这是计数哈希表和mystruct结构。是否有可能创建一个内核模块函数来拥有一个指向任何结构的占位符指针和该结构的kmalloc内存?另外如何将哈希表名称作为参数传递?

1 个答案:

答案 0 :(得分:0)

您无法创建接受名称功能:它是C语言禁止的。因此,您的函数可能只接受哈希表的指针。但由于它接受指针,您可能不再使用hash_add之类的宏,这需要 name

你有2个可能性:

  1. 创建类似函数的,因此它可以接受哈希表名称,结构和其他定义。
  2. 这种方式通常由Linux内核使用,它往往是快速。请注意,hash_addhash_for_each_possible等操作也是宏。

    1. 将哈希表包装到您自己的结构中。在相同的结构中,您需要添加有关散列元素的所有其他信息:size(对于kmalloc),来自元素的键的getter(用于搜索)和用于它的setter(用于插入器),等等。 / LI>

      这样的东西
      struct my_hashtable {
           DECLARE_HASHTABLE(count, 7);
           size_t obj_size;
           unsigned long (*get_key)(void* obj);
           void (*set_key)(void* obj, unsigned long key);
      };