我目前正在编写一个内核模块,它使用多个哈希表来存储不同的结构。我将如何实现一个通用函数,该函数将哈希表名称,哈希键和结构存储为参数并执行相应的存储操作? 这是我的哈希表和结构定义。
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内存?另外如何将哈希表名称作为参数传递?
答案 0 :(得分:0)
您无法创建接受名称的功能:它是C语言禁止的。因此,您的函数可能只接受哈希表的指针。但由于它接受指针,您可能不再使用hash_add
之类的宏,这需要 name 。
你有2个可能性:
这种方式通常由Linux内核使用,它往往是快速。请注意,hash_add
,hash_for_each_possible
等操作也是宏。
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);
};