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

Why do user space apps need kernel headers?

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

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

一般来说,那些 headers 是必需的,因为用户空间应用程序经常与内核对话,传递一些数据。为此,他们必须就他们之间传递的数据结构达成一致。

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

但是,内核提供的一些 "custom services" 不由 libc 处理。一个例子是创建直接与某些硬件驱动程序对话的用户空间程序。这可能需要传递一些数据结构(所以你需要一些结构定义),知道一些幻数(所以你需要一些定义)等

例如,查看来自内核源代码的 hid-example.c。例如,它将调用此 ioctl:

struct hidraw_report_descriptor rpt_desc;
[...]
ioctl(fd, HIDIOCGRDESC, &rpt_desc);

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