我以我的第一次尝试写一些Linux内核代码,我打一个奇怪的内核崩溃。

我有一个链表我与内核的内置宏保持(在include / linux / list.h)。如果该列表为空,我分配以下结构的一个实例:

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

和指向它与一个称为“TMP”指针。我添加到TMP我与list_add_tail()保持的列表中。

之后,如果该列表不为空(我想用一个列表项进行测试,以简化调试),我指向与TMP列表中的第一项,并尝试打印出的TMP-内容>结束.tv_sec。不幸的是,这将导致内核崩溃。

TMP不是NULL(I检查在运行时)和既不是“TMP->端”(我能够同时打印)。只有当我尝试访问“结束”的领域,我得到一个内核恐慌之一。我从来没有见过这样的事情之前 - ?没有任何人有任何想法

感谢您的任何帮助!

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

代码示例(在此住在一个将被反复调用的函数):

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

    // ........
有帮助吗?

解决方案

您错过一些基本面关于Linux链表。 以下应该改变:

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

要: 结果

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

在使用Linux链表,你应该把结构LIST_HEAD你的结构里面,你想的列表。点击 在下面的代码,你分配一个类型struct time_span和引用分配变量time_listnew_time_span变量命名的......但是你有没有补充说,你的结构之上。

// .........
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;
        }
    }

根据您所提供的信息,我不知道为什么上面休息。也许这只是TMP是一个指针指向垃圾,这就是为什么它会崩溃?如果你有一个内核调试器的设置很容易验证。

        // .........

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

    // ........

下面是一些好的文章,应该有所帮助: 点击 http://kernelnewbies.org/FAQ/LinkedLists 结果 http://sumanadak.blogspot.com/2006/09/ Linux内核联-list.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top