Puncte:0

Construirea unui modul Linux - sys/time.h: Nu există un astfel de fișier sau director

drapel in

Încerc să construiesc un driver Linux vechi în sistemul meu (Kubuntu 21.10) cu face -C....
Șoferul declară struct static timeval frame_timestamp;

Dacă încerc să-l construiesc cu ceva de genul

make -C /lib/modules/`uname -r`/build M=`pwd` V=1 module

Primesc ... are un tip incomplet âstruct timevalâ eroare și alte erori asociate.
Deci cred că trebuie să includ sys/time.h cu #include <sys/time.h> în cod.
Dar în acest caz primesc eroare fatală: sys/time.h: Nu există un astfel de fișier sau director. Și nu găsesc o modalitate de a rezolva asta. (Codul avea deja unele include, dar niciuna de la sys/, toate sunt de la Linux/ și media/)

Am ajuns să am un următor Makefile:

obj-m := mydriver.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

Mod implicit:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) M=$(PWD) V=1 module

The KDIR se rezolvă în /lib/modules/5.13.0-21-generic/build care se leagă de /usr/src/linux-headers-5.13.0-21-generic. Nu este sys/time.h.

localizați sys/time.h se intoarce:

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

care îi aparține libc6-dev și libc6-dev-i386:.
dpkg -l *5.13.0-21* ofera:

ii linux-headers-5.13.0-21 5.13.0-21.21 toate fișierele Header legate de versiunea 5.13.0 a nucleului Linux
ii linux-headers-5.13.0-21-generic 5.13.0-21.21 amd64 Antete kernel Linux pentru versiunea 5.13.0 pe 64 de biți x86 SMP
ii linux-image-5.13.0-21-generic 5.13.0-21.21 amd64 Imagine kernel semnată generică
un linux-image-unsigned-5.13.0-21-generic <неÑ> <неÑ> (опиÑание недоѾÑÑоÑÑÐ
ii linux-modules-5.13.0-21-generic 5.13.0-21.21 amd64 Linux kernel module suplimentare pentru versiunea 5.13.0 pe 64 de biți x86 >
ii linux-modules-extra-5.13.0-21-generic 5.13.0-21.21 amd64 Linux kernel module suplimentare pentru versiunea 5.13.0 pe 64 de biți x86

Încercam să codific -I /usr/include/x86_64-linux-gnu/ în face -C - nu are niciun efect.
De asemenea, am încercat să descarc un nucleu vanilla de pe kernel.org: https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.13.tar.xz și codificați-l ca KDIR - asta nu ajută și nu conține sys/time.h fie.

Întrebarea este: cum îmi forțez procesul de construire a modulului să vadă sys/time.h?
Modulul Linux permite conectarea la libc? Dacă nu face parte din nucleu, cum să-l faceți disponibil pentru procesul de construire a modulului?

Puncte:-2
drapel in

Ok, se pare că nu se poate folosi sys/time.h în modulul kernel.
Am aruncat o privire asupra definiției struct v4l2_buffer în linux/videodev2.h unde struct timeval ar trebui să fie folosit de driver pentru a-și inițializa timestamp-ul câmp și găsit acolo:

camion v4l2_buffer {
    __u32 index;
    __u32 tip;
    __u32 octeți utilizați;
    __u32 steaguri;
    câmp __u32;
#ifdef __KERNEL__
    struct __kernel_v4l2_timeval timestamp;
#altfel
    struct timeval timestamp;
#endif
    struct v4l2_timecode timecode;
....

The __NUCLEU__ este definită automat undeva în face -C proces, așa că nucleul actualizat se așteaptă să primească __kernel_v4l2_timeval. Înlocuirea struct timeval cu struct __kernel_v4l2_timeval printre alte trucuri mi-au permis să compilez acest driver vechi.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.