c - 如何使用内核头文件编译用户空间程序

标签 c linux linux-kernel kernel linux-device-driver

我需要使用 ioctl 测试一个 usbfs 设备。 我需要使用 ioctl(fd, USBDEVFS_REAPURBNDELAY, &receive);。 但是 USBDEVFS_REAPURBNDELAY 是在内核头文件中定义的,所以我包含了一些这样的内核文件:

#include <linux/usb.h>
#include <linux/usbdevice_fs.h>
#include <asm/byteorder.h>
#include <linux/usb/ch9.h>

并用编译它 gcc -g -I/usr/src/linux-3.4.4-2-pae/include/-o/home/madper/kernel/usb/select_for_usb/home/madper/kernel/usb/select_for_usb.c

它说#warning“尝试使用来自用户空间的内核头文件,请参阅http://kernelnewbies.org/KernelHeaders”[-Wcpp]

然后出现了很多错误,那么,使用内核头文件的正确方法是什么?

/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:21:2: error: unknown type name ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:36:2: error: unknown type name ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:37:33: error: ‘kernel_ulong_t’ undeclared here (not in a function)
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:37:3: error: requested alignment is not an integer constant
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:119:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:141:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:154:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:168:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:179:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:187:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:195:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:200:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:227:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:260:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:314:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:341:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:366:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:413:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:433:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:444:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:479:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:508:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:540:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:551:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:566:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/usr/src/linux-3.4.4-2-pae/include/linux/mod_devicetable.h:582:2: error: expected specifier-qualifier-list before ‘kernel_ulong_t’
/home/madper/kernel/usb/select_for_usb.c: In function ‘main’:
/home/madper/kernel/usb/select_for_usb.c:46:30: error: expected expression before ‘void’

最佳答案

你真的不应该直接包含内核头文件。在某些情况下,这是必要的,而且可能最好的处理方法是获取内核头文件的副本,然后只提取您需要的部分。但在这种情况下,我不确定我是否理解你为什么需要内核头文件。为什么只包含 <linux/usbdevice_fs.h> 不起作用? ?

在我查看的所有系统(几个不同的 Ubuntu 系统和一个 RHEL 6 系统)上,该文件可以从用户空间包含并且定义为 USBDEVFS_REAPURBNDELAY .我试过了

#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>

int main()
{
    printf("USBDEVFS_REAPURBNDELAY is %ld\n", USBDEVFS_REAPURBNDELAY);
    return 0;
}

我可以干净地构建它,当我运行它时我得到了

USBDEVFS_REAPURBNDELAY is 1074287885

所以至少根据你上面写的,你不需要任何内核头文件来定义 ioctl。我怀疑您认为用户空间 USB 所需的任何其他内容都以干净的 header 类似地导出到用户空间。

关于c - 如何使用内核头文件编译用户空间程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11558671/

相关文章:

ruby - 如何修复 Linux 中的 "usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed"错误?

linux - 如何使用变量预设启动 shell (fish)

linux - 如何从 Windows 机器检查 Linux 文件 (.so) 是 32 位还是 64 位

linux - LD_PRELOAD 栈和数据段内存分配

c - 套接字通信的奇怪循环

c - 广义链表: Adding Child Link whenever an opening bracket occurs

c - 为什么这个 float 数组元素可以正确打印,但这个 double 数组元素却不能正确打印?

linux - 内核编译找不到 .config 文件

linux - 当我阅读 head.s(Linux 内核文件之一)时遇到问题

c - 从算术运算中获取溢出