0

Linux カーネル モジュールを作成していますが、いくつか問題があります。これらのポインター値を確認した後、私のモジュールは正しく機能しません。

static struct area_control {
    struct list_head head;
    unsigned long addr;
    unsigned long jiffies;
    struct area_part *part;
} *const_areas = NULL, *var_areas = NULL;

static struct area_control *Find_Area(unsigned long addr, struct area_control *first_area)
{
    if (first_area)
    {
        struct area_control *cur_area = first_area;
        while ( 1 ) 
        {
            if (!cur_area) return NULL;
            if (cur_area->addr == addr)
            {
                cur_area->jiffies = jiffies;
                return cur_area;
            }
            cur_area = list_entry(cur_area->head.next, struct area_control, head);
            if (cur_area == first_area) return NULL;
        }
    }
    return NULL;
}

cur_area->head.next cur_area が NULL であるため、ある時点で モジュールが落ちます! - この事実は、コール トレースと逆アセンブラから取得しました。Linux 2.6.34 x86_64 マルチプロセッサ アーキテクチャ用モジュール

4

1 に答える 1

0
        cur_area = list_entry(cur_area->head.next, struct area_control, head);

かどうかも確認する必要があり cur_area->head.nextますNULL

マクロ定義の使用:

#define list_entry(ptr, type, member) \
((type *)((char *)(ptr) – (unsigned long)(&((type *)0)->member)))

コードは次のように展開されます。

        cur_area = ((struct area_control *)((char *)(cur_area->head.next) - (unsigned long(&((struct area_control *)0)->head)))

ご覧のとおり、cur_area->head.nextnull の場合、このコードは失敗します。

于 2013-01-14T13:14:21.407 に答える