3

我编写了一个 PCIe 设备驱动程序,但读/写功能无法正常工作。该设备有 3 个内存区域,从 0x10800000、0x0c000000 和 0x80000000 开始。仅出于测试目的,我在驱动程序中的读写函数打印出传递的地址并返回。如果我从用户空间应用程序调用 pread() 或 pwrite(),我会看到为前 2 个内存区域传递的地址,但如果我调用第三个内存区域,我什么也看不到,好像它没有t 甚至进入驱动程序读取或写入函数。

我的驱动程序在运行 linux 版本 2.6.32 的 64 位机器上运行良好。这台无法运行的机器是运行 linux 版本 2.6.25 的 32 位机器。我的想法是,也许 32 位不喜欢 0x80000000 地址,但如果是这种情况,我不知道如何验证或修复它。

4

1 回答 1

1

这是一个非常模糊的问题(您正在对什么文件进行预读/写操作?)但是由于您说一切都在 64 位上运行并且您的驱动程序甚至没有在 32 位上被调用,所以我猜问题是的大小off_t和 0x80000000 溢出 32 位并成为一个巨大的负数的事实。

如果你把

  #define _FILE_OFFSET_BITS 64

作为用户空间源代码的第一行?(或者在 gcc 命令行上传递“-D_FILE_OFFSET_BITS=64”)?

于 2012-09-07T22:43:45.120 回答