2016-10-14 2 views
0

В настоящее время я пишу модуль ядра, который использует несколько хэш-таблиц для хранения различных структур. Как я могу реализовать единую универсальную функцию, которая бы использовала имя хэш-таблицы, хеш-ключ и структуру для сохранения в качестве параметров и выполняла ли соответствующая операция хранилища? Вот моя хэш-таблица и определение структуры.Как создать универсальную функцию для определения имени хэш-таблицы и структуры как параметров в модуле ядра?

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

Вот мой магазин код (я, кажется, получают нулевую ошибку указателя, если я увеличиваем TEMP-> данные непосредственно вместо того, чтобы делать это мой окольный добавить и дель путь :()

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); 

Это можно сделать для хэш-таблицы count и структуры mystruct. Можно ли создать функцию модуля ядра для указателя-заполнителя для любой структуры и памяти kmalloc для этой структуры? Также как передать имя хеш-таблицы в качестве параметра?

ответ

0

Вы не может создать function который принимает имя из хеш-таблицы: запрещено языком C. Таким образом, ваша функция может принимать только указатель на хеш-таблицу. Но поскольку он принимает указатель , вы можете больше не использовать макросы, такие как hash_add, для чего требуется имя.

У вас есть 2 possibilites:

  1. Создание функции, как макрос, поэтому он может принять хеш имя, структуру и другие определения.

Этот способ обычно используется ядром Linux, который имеет тенденцию быть быстро. Обратите внимание, что операции, подобные hash_add, hash_for_each_possible, также являются макросами.

  1. Оберните хеш-карту в вашу собственную структуру. В такой же структуре вам нужно добавить всю дополнительную информацию о хэш-элементах: size (для kmalloc), getter ключа из элемента (для поиска) и setter для него (для вставки) и т. Д.

Что-то вроде

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); 
};