Я делаю свою первую попытку написать код ядра Linux, и у меня возникает странная паника ядра.
У меня есть связанный список, который я поддерживаю с помощью встроенных макросов ядра (include/linux/list.h). Если список пуст, я выделяю экземпляр следующей структуры:
struct time_span
{
struct timeval start;
struct timeval end;
};
и укажите на него указателем под названием «tmp». Я добавляю tmp в список, который я поддерживаю с помощью list_add_tail().
Позже, если список не пуст (я пытаюсь протестировать с одним элементом списка для упрощения отладки), я указываю на первый элемент в списке с помощью tmp и пытаюсь распечатать содержимое tmp->end.tv_sec. К сожалению, это вызывает панику ядра.
tmp не равно NULL (я проверяю во время выполнения), как и «tmp->end» (я могу распечатать оба). Только когда я пытаюсь получить доступ к одному из полей в «конце», я получаю панику ядра. Я никогда не видел ничего подобного раньше, у кого-нибудь есть идеи?
Спасибо за любую помощь!
-------РЕДАКТИРОВАТЬ------
Пример кода (это находится в функции, которая будет вызываться неоднократно):
// .........
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));
}
// ........
tmp->end
(и код вокруг него). - person T.J. Crowder   schedule 13.12.2009