Python,使用太大的地址调用mmap会导致溢出异常

时间:2011-07-19 02:24:01

标签: python posix

我正在转换一些通过mmap访问设备驱动程序的C代码。我以为我可以轻松地在Python中做类似的事情。但是我遇到了这个问题。需要mmap的地址由PCI配置提供,因此我无法控制此地址。在这种情况下,找到的地址是3451912192.地址字段当然是无符号整数,是32位。

此地址恰好位于无符号整数但不是有符号整数的范围内。当我调用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。至少在offset > 0中对mmap的检查可能不正确。为什么检查这个?如果操作系统不受支持,请让它返回错误代码。

1 个答案:

答案 0 :(得分:1)

我曾经遇到过类似的问题,我还想在64位机器上mmap更大,然后4GB的数据块到64位编译的Python中。

如果我没记错,它的主要原因是,最基本的python-object struct包含对象大小成员,只有 32bit < / strong>即可。要改变这种情况是非常困难的,你可以说,你需要彻底检查整个语言,特别是修复所有已编译的扩展。

我不确定,但这可能是用Python 3.0完成的。