Начал глубоко изучать list_head в ядре линукса - наткнулся на непонимание базового принципа работы.
Все макросы list_foreach_* начинают перебор со _второго_ объекта, то есть пропускается самый первый объект.
Это наводит на мысль, что первый объект _всегда_ должен быть «мусорным», то есть он нигде не применяется, а служит только для указания головы списка.
Либо этот самый первый объект должен обрабатываться вручную, что, по-моему, глупо.
Я так понял, что если у меня в программе динамически создаются объекты типа struct my_list_object, которые имеют внутри list_head, то чтобы в _другом_ объекте иметь указатель на этот список, я должен:
1. Либо сделать один «мусорный» объект struct my_list_object, от которого я буду стартовать.
2. Либо иметь указатель на struct my_list_obj * или на соответствующий struct list_head *, который будет равен NULL при пустом списке и иметь нормальное значение при непустом списке.
Мне кажется, что вариант (1) более разумен, однако, смущает наличие мусорного объекта.
Я правильно понимаю «философию» list_head? Если нет, то как надо его применять?