Linux カーネル コードの作成に初めて取り組んでいるのですが、奇妙なカーネル パニックに陥っています。
カーネルの組み込みマクロ (include/linux/list.h) で維持しているリンク リストがあります。リストが空の場合、次の構造のインスタンスを割り当てます。
struct time_span
{
struct timeval start;
struct timeval end;
};
「tmp」というポインターでそれを指します。list_add_tail() で維持しているリストに tmp を追加します。
後で、リストが空でない場合 (デバッグを簡単にするために 1 つのリスト項目でテストしようとしています)、tmp でリストの最初の項目をポイントし、tmp->end.tv_sec の内容を出力しようとします。残念ながら、これによりカーネル パニックが発生します。
tmp は NULL ではなく (実行時にチェックします)、「tmp->end」でもありません (両方を出力できます)。カーネル パニックが発生するのは、"end" のフィールドの 1 つにアクセスしようとしたときだけです。私はこれまでにこのようなものを見たことがありません - 誰か何かアイデアを持っていますか?
ご協力ありがとうございます。
- - - -編集 - - -
コード例 (これは、繰り返し呼び出される関数内にあります):
// .........
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));
}
// ........