2011-07-19 26 views
9

我将它通过mmap的访问设备驱动程序的一些C代码。我认为我可以很容易地在Python中做类似的事情。不过,我遇到了这个问题。需要mmap的地址由PCI配置提供,所以我无法控制该地址。在这种情况下,找到的地址是3451912192.地址字段当然是一个无符号整数,并且是32位。Python中,调用MMAP具有过大的地址导致溢出异常

这个地址恰好是在范围,其中它适合在一个无符号整数,但没有一个有符号整数。当我打电话的mmap,我得到以下异常:

OverflowError: long int too large to convert to int 

所以Python是人为地告诉我数不适合,因为它认为它的签署。有可能以某种方式解决这个问题,或者我必须在C中执行mmap调用吗?

注意指针转换成相当于负值给出:

OverflowError: memory mapped offset must be positive 

eryksun指出,C接口实际上是指定一个符号的值,所以Python是从一个语义指向正确的,但它赢得了”让我绕过这个C程序能够忽略的限制。

事实上,lspci表明,该装置具有资源:

Memory at cdc00000 (32-bit, non-prefetchable) [size=1M] 

0xcdc00000==3451912192。看起来至少在mmap中检查offset > 0可能是不正确的。为什么检查这个?如果操作系统不支持,让操作系统返回一个错误代码。

+0

你有什么作为传递对mmap(FD)的第一个参数? –

+0

'posix.open(“/ dev/mem”,posix.O_RDWR)的输出。 – Steve

+0

@eryksum:这是一个32位系统。你是对的,'off_t'确实是一个签名类型。尽管如此,我已经验证了我试图复制的C代码正在传递这样的值。如果我将它转换为等价的负值,'mmap'模块也会给我一个错误。我想我可以尝试通过ctypes实现我自己的'mmap'。 – Steve

回答

1

我有一个类似的问题一次,我也想mmap一个更大的,然后-4GB的数据块的64位计算机上为64位编译的Python。

如果我没有记错的主要原因是它没有发挥出来了,那最根本的蟒蛇对象struct包含对象大小成员,这是只有32位。要改变这一点非常困难,你可以说,你需要彻底改变整个语言,尤其是修复所有编译的扩展。

我不知道,但是这可能已经与Python 3.0来完成。

相关问题