3

を使用して usbfs デバイスをテストする必要がありioctlます。私は使用する必要があります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 "Attempt to use kernel headers from user space, see 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’
4

2 に答える 2

3

カーネルヘッダーを直接含める必要はありません。場合によっては、カーネル ヘッダーのコピーを取得し、必要な部分だけをハックすることが必要であり、おそらくこれを処理する最善の方法です。しかし、この場合、カーネル ヘッダーが必要な理由がよくわかりません。を含めるだけでは機能しないのはなぜ<linux/usbdevice_fs.h>ですか?

私が調べたすべてのシステム (いくつかの異なる Ubuntu システムと 1 つの 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 に必要だと思われるものはすべて、同様にクリーンなヘッダーでユーザー空間にエクスポートされるのではないかと思います。

于 2012-07-20T09:22:19.943 に答える
2

ユーザープログラムにカーネルヘッダーを使用することはできません。何らかの手段で行ったとしても、それは強くお勧めできません。詳細については、以下のリンクを確認してください。

http://lwn.net/Articles/113349/

ユーザースペースからUSBデバイスを制御したい場合は、libusbを参照してください。

于 2012-07-19T10:41:57.033 に答える