Рейтинг:0

Сборка модуля Linux — sys/time.h: Нет такого файла или каталога

флаг in

Я пытаюсь создать старый драйвер Linux в своей системе (Kubuntu 21.10) с помощью сделать -С....
Водитель заявляет статическая структура timeval frame_timestamp;

Если я попытаюсь построить его с чем-то вроде

make -C /lib/modules/`uname -r`/build M=`pwd` V=1 модули

я собираюсь ... имеет неполный тип "struct timeval" ошибка и некоторые другие связанные ошибки.
Поэтому я считаю, что должен включить sys/time.h с #include <sys/time.h> в код.
Но в этом случае я получаю фатальная ошибка: sys/time.h: нет такого файла или каталога. И я не могу найти способ решить эту проблему. (В коде уже есть некоторые включения, но ни одного из sys/, все они из linux/ и media/)

Я закончил со следующим Makefile:

obj-m := mydriver.o
KDIR := /lib/modules/$(оболочка uname -r)/сборка
PWD := $(оболочка pwd)

По умолчанию:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) M=$(PWD) V=1 модулей

КДИР превращается в /lib/modules/5.13.0-21-общий/сборка который ссылается на /usr/src/linux-заголовки-5.13.0-21-общий. Здесь нет систем/время.ч.

найти sys/time.h возвращает:

/usr/include/i386-linux-gnu/sys/time.h
/usr/include/sys/time.h
/usr/include/x86_64-linux-gnu/sys/time.h

который принадлежит libc6-dev и libc6-dev-i386:.
dpkg -l *5.13.0-21* дает:

ii linux-headers-5.13.0-21 5.13.0-21.21 все файлы заголовков, относящиеся к версии ядра Linux 5.13.0
ii linux-headers-5.13.0-21-generic 5.13.0-21.21 amd64 Заголовки ядра Linux для версии 5.13.0 на 64-разрядной платформе x86 SMP
ii linux-image-5.13.0-21-generic 5.13.0-21.21 amd64 Общий образ ядра с подписью
un linux-image-unsigned-5.13.0-21-generic <неÑ> <неÑ> (опиÑание недоÑÑÑпно)
ii linux-modules-5.13.0-21-generic 5.13.0-21.21 amd64 Дополнительные модули ядра Linux для версии 5.13.0 на 64-разрядной версии x86 >
ii linux-modules-extra-5.13.0-21-generic 5.13.0-21.21 amd64 Дополнительные модули ядра Linux для версии 5.13.0 на 64-разрядной платформе x86

Я пытался жестко закодировать -I /usr/include/x86_64-linux-gnu/ в сделать -С - это не влияет.
Я также попытался загрузить ванильное ядро ​​с kernel.org: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.13.tar.xz и жестко запрограммировать его как КДИР - это не помогает и не содержит систем/время.ч либо.

Вопрос в том, как заставить мой процесс сборки модуля видеть систем/время.ч?
Разрешается ли модулю linux связываться с libc? Если это не часть ядра, как сделать его доступным для процесса сборки модуля?

Рейтинг:-2
флаг in

Хорошо, кажется, нельзя использовать систем/время.ч в модуле ядра.
Я ознакомился с определением структура v4l2_buffer в Linux/videodev2.h где структура timeval должен использоваться драйвером для инициализации своего отметка времени поле и нашел там:

truct v4l2_buffer {
    __у32 индекс;
    __тип у32;
    __u32 байта использовано;
    __u32 флаги;
    поле __u32;
#ifdef __KERNEL__
    структура __kernel_v4l2_timeval временная метка;
#еще
    временная метка структуры времени;
#endif
    struct v4l2_timecode тайм-код;
....

__ЯДРО__ определяется автоматически где-то в сделать -С процесса, поэтому обновленное ядро ​​ожидает получить __kernel_v4l2_timeval. Замена структура timeval с структура __kernel_v4l2_timeval среди некоторых других трюков позволил мне скомпилировать этот старый драйвер.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.