2016-10-14 13 views
0

私は現在、さまざまな構造を格納するために複数のハッシュテーブルを使用するカーネルモジュールを作成しています。ハッシュテーブルの名前、ハッシュキー、構造体をパラメータとして格納し、対応するストア操作を行う単一の汎用関数を実装するにはどうすればよいですか? ここに私のハッシュテーブルと構造体の定義があります。ここでハッシュテーブルの名前と構造体をカーネルモジュールのパラメータとして使用する汎用関数を作成するにはどうすればよいですか?

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

は私の店コード(私はtemp->データをインクリメントする代わりに、直接の私のラウンドアバウトを追加し、デルの方法:(それをやった場合はnullポインタエラーを取得しているようだ)

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

ですこれは、カウントハッシュテーブルと構造体のためのものです。構造体へのポインタと構造体へのポインタを持つカーネルモジュール関数を作成することはできますか?また、ハッシュテーブル名をパラメータとして渡す方法は?

答えて

0

を作成できません関数は、ハッシュテーブルの名前を受け付けます。これはC言語で禁止されています。したがって、あなたの関数は、ポインタハッシュテーブルにのみ受け入れることができます。しかしポインタを受け入れるので、の名前を必要とするhash_addのようなマクロは使用できなくなります。

あなたは2 possibilites持っている:

  1. それはハッシュテーブル名、構造およびその他の定義を受け入れることができるように、関数のようなマクロを作成します。

この方法では、一般的に速いになりやすいのLinuxカーネルで使用されています。 hash_add,hash_for_each_possibleなどの操作もマクロであることに注意してください。

  1. 独自の構造にハッシュテーブルをラップします。同じ構造体に、サイズ(kmalloc)、要素からのキーの取得(検索用)、およびセッター(インサータ用)など、ハッシュ要素に関する追加情報をすべて追加する必要があります。

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); 
}; 
ような何かを
関連する問題