为什么用户空间应用程序需要内核头文件?

sus*_*dey 0 smartphone linux-kernel

我正在研究一个智能手机项目。在编译过程中,它为用户空间构建安装内核头文件。

为什么用户空间应用程序需要内核头文件?

Krz*_*ski 5

通常,需要这些头文件是因为用户空间应用程序经常与内核通信,传递一些数据。为此,他们必须就他们之间传递的数据结构达成一致。

大多数内核头文件只有 libc 库(如果您正在使用)才需要,因为它通常通过提供符合 POSIX 等标准的抽象来隐藏所有低级方面(它通常会提供自己的包含文件)。例如,这些头文件将提供所有系统调用编号和参数使用的所有结构的定义。

但是,内核提供的一些“自定义服务”不是由 libc 处理的。一个例子是创建直接与某些硬件驱动程序对话的用户空间程序。这可能需要传递一些数据结构(因此您需要一些结构定义)、了解一些幻数(因此您需要一些定义)等。

例如,从内核源代码中查看hid-example.c。例如,它会调用这个 ioctl:

struct hidraw_report_descriptor rpt_desc;
[...]
ioctl(fd, HIDIOCGRDESC, &rpt_desc);
Run Code Online (Sandbox Code Playgroud)

但是它从哪里得到HIDIOCGRDESC或知道 的结构struct hidraw_report_descriptor?它们当然被定义在linux/hidraw.h这个应用程序中。