0

priをヘッドノードとするリンクリストに関するモジュールを作成します。最初は空です。

pri_init()で、リストに3つのノードを挿入し、それぞれに値を割り当てます。最後に、list_for_each_entryを使用してリストを反復処理し、ノードの値を出力します。

しかし実際には、 pri_init()のlist_for_each_entry{...}にランダムな値を1つだけ出力しました。

代わりに、 for()ループ内でcontainer_ofを使用 してリストを反復処理すると、結果は正しくなります。

誰か教えてもらえますか?どうもありがとう。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <asm/uaccess.h>
#include <linux/list.h>  
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/sched.h>

MODULE_LICENSE("GPL");

struct pri_listitem
{
    int v;
    struct list_head list;   
};

LIST_HEAD(pri);

void pri_exit(void)
{
    struct pri_listitem *list_p, *next;
    list_for_each_entry_safe(list_p, next, &pri, list)
    {
        list_del(&list_p->list);
        kfree(list_p);
    }
    printk(KERN_ALERT "***** device pri exit() ***** \n");
}

int pri_init(void)
{
    int i;
    struct pri_listitem *list_p;

    printk(KERN_ALERT "***** device pri init() ***** \n");
    // Inserting 3 nodes
    for(i=1; i<=3; ++i)
    {
            list_p = kmalloc(sizeof(struct pri_listitem),GFP_KERNEL);
            if(!list_p)
            {
                printk(KERN_DEBUG "Error: alloction memory for list_p\n");
                return -ENOMEM;
            }
            memset(list_p, 0, sizeof(struct pri_listitem));
            list_p->v = i;
            list_add(&(list_p->list), &pri);
    }

   printk(KERN_DEBUG "value of the 3 nodes:\n");
   list_for_each_entry(list_p, &pri, list);
   {
           printk(KERN_DEBUG "%d\n",list_p->v);  // print nodes' value
   } 
   return 0;
}

module_init(pri_init);
module_exit(pri_exit);
4

1 に答える 1

1

各エントリのリストの最後にセミコロンがあるだけです。これは、位置がメモリ内のガベージ値に設定されていることを意味します(実際には、メモリ内の割り当てられたlist_head pri構造の後ろのオフセットだけガベージではありません)。したがって、ランダムな値を取得します。逆参照(アクセスできるメモリに不幸にも到達したため、エラーを見つけるのが難しい場合があります。)list_for_each_entryの次のセクションは、スコープブロックとして実行されるだけなので、ループを1回実行するだけでヒントが得られます。

于 2012-12-07T08:40:31.903 に答える