Frage

Ich nehme meinen ersten Riss an einig Linux-Kernel-Code zu schreiben, und ich bin eine seltsame kernel panic schlagen.

Ich habe eine verknüpfte Liste, die ich mit der Kernel-integrierten Makros bin beibehalten (include / linux / list.h). Wenn die Liste leer ist, zuteilen ich eine Instanz der folgenden Struktur:

struct time_span
{
   struct timeval start;
   struct timeval end;
};

und zeigen Sie auf es mit einem Zeiger namens „tmp“. Ich füge tmp in die Liste I mit list_add_tail bin Aufrechterhaltung ().

Später, wenn die Liste nicht leer ist (Ich versuche, mit einem Listenelement zu testen, Debuggen zu vereinfachen), ich auf das erste Element in der Liste mit tmp zeigen und versuchen, den Inhalt der tmp- drucken> Ende .tv_sec. Leider ist dies verursacht eine Kernel-Panik.

tmp nicht NULL ist (ich zur Laufzeit überprüfen) und weder „tmp-> end“ (Ich bin in der Lage sowohl zu drucken). Es ist nur, wenn ich versuche eines der Felder für den Zugriff auf „Ende“, dass ich eine Kernel-Panik bekommen. Ich habe noch nie etwas Vergleichbares gesehen vor - hat jemand irgendwelche Ideen

Vielen Dank für jede Hilfe!

------- ------ EDIT

Codebeispiel (das lebt in einer Funktion, die immer wieder genannt wird):

// .........
struct timeval now_tv;
do_gettimeofday(&now_tv);
if(!list_empty(&(my_list.time_list)))
    {
        tmp = list_first_entry(&(my_list.time_list), struct time_span, time_list);
        if(tmp != NULL)
        {
                    tmp->end.tv_sec = now_tv.tv_sec; // THIS BREAKS
                                                     // Attempting to print "tmp->end.tv_sec" also breaks.
            tmp->end.tv_usec = now_tv.tv_usec;
        }
    }

        // .........

    if(list_empty(&(my_list.time_list)))
        {
        new_time_span = (struct time_span *) kmalloc(sizeof(struct time_span), GFP_KERNEL);
        INIT_LIST_HEAD(&(new_time_span->time_list));
        list_add_tail(&(new_time_span->time_list), &(my_list.time_list));
            do_gettimeofday(&(new_time_span->start));
    }

    // ........
War es hilfreich?

Lösung

Sie fehlen einige Grundlagen über Linux-Listen verknüpft. Folgendes sollte ändern:

struct time_span
{
   struct timeval start;
   struct timeval end;
};

An:

struct time_span
{
   struct timeval start;
   struct timeval end;
   struct list_head time_list;
}

Bei der Verwendung von Linux-Listen verknüpft sollten Sie die Struktur listjead in Ihrer Struktur setzen, dass Sie eine Liste möchten.
Im folgenden Code sind Sie eine Art struct time_span Aufteilung und eine Variable mit dem Namen time_list innerhalb der zugewiesenen Variable new_time_span Referenzierung ... aber Sie haben nicht hinzugefügt, dass auf Ihre Struktur oben.

// .........
struct timeval now_tv;
do_gettimeofday(&now_tv);
if(!list_empty(&(my_list.time_list)))
    {
        tmp = list_first_entry(&(my_list.time_list), struct time_span, time_list);
        if(tmp != NULL)
        {
                    tmp->end.tv_sec = now_tv.tv_sec; // THIS BREAKS
                                                     // Attempting to print "tmp->end.tv_sec" also breaks.
                tmp->end.tv_usec = now_tv.tv_usec;
        }
    }

Auf der Grundlage der Informationen, die Sie zur Verfügung gestellt haben, ich weiß nicht, warum die oben bricht. Vielleicht ist es nur, dass tmp ein Zeiger, der auf Müll ist und das ist, warum es abstürzt? Wenn Sie einen Kernel-Debugger-Setup haben es einfach zu überprüfen.

        // .........

    if(list_empty(&(my_list.time_list)))
        {
        new_time_span = (struct time_span *) kmalloc(sizeof(struct time_span), GFP_KERNEL);
        INIT_LIST_HEAD(&(new_time_span->time_list));
        list_add_tail(&(new_time_span->time_list), &(my_list.time_list));
            do_gettimeofday(&(new_time_span->start));
    }

    // ........

Hier sind einige gute Artikel, die helfen sollen:
http://kernelnewbies.org/FAQ/LinkedLists
http://sumanadak.blogspot.com/2006/09/ linux-Kernel-Linked-list.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top