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

Ste*_*eve 9 python posix

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

该地址恰好位于无符号整数但不是有符号整数的范围内.当我调用mmap时,我得到以下异常:

OverflowError: long int too large to convert to int
Run Code Online (Sandbox Code Playgroud)

所以Python人为地告诉我这个号码不合适,因为它认为它是签名的.有可能以某种方式解决这个问题,还是我必须在C中进行mmap调用?

请注意,将指针转换为等效的负值会给出:

OverflowError: memory mapped offset must be positive
Run Code Online (Sandbox Code Playgroud)

eryksun指出C接口实际上指定了一个带符号的值,因此Python从语义的角度来看是正确的,但它不会让我绕过C程序能够忽略的这种限制.

确实,lspci揭示该设备有资源:

Memory at cdc00000 (32-bit, non-prefetchable) [size=1M]
Run Code Online (Sandbox Code Playgroud)

0xcdc00000==3451912192.这将至少是似乎对检查offset > 0mmap可能是不正确的.为什么检查这个?如果不支持,请让操作系统返回错误代码.

tow*_*owi 1

我曾经遇到过类似的问题,我也想将mmap64 位机器上大于 4GB 的数据块转换为 64 位编译的 Python。

如果我没记错的话,它没有成功的主要原因是,最基本的 python-objectstruct包含一个对象大小成员,它只有32bit。要改变这一点非常困难,您可以说,您需要彻底检查整个语言,尤其是修复所有已编译的扩展。

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