我正在转换一些通过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 > 0中mmap可能是不正确的.为什么检查这个?如果不支持,请让操作系统返回错误代码.
我曾经遇到过类似的问题,我也想将mmap64 位机器上大于 4GB 的数据块转换为 64 位编译的 Python。
如果我没记错的话,它没有成功的主要原因是,最基本的 python-objectstruct包含一个对象大小成员,它只有32bit。要改变这一点非常困难,您可以说,您需要彻底检查整个语言,尤其是修复所有已编译的扩展。
我不确定,但这可能是用 Python 3.0 完成的。