Python调用mmap时地址过大导致溢出异常

9 投票
1 回答
775 浏览
提问于 2025-04-16 21:48

我正在把一些C语言代码转换成Python,这段代码是通过mmap来访问设备驱动的。我原以为在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。至少可以看出,在mmap中对offset > 0的检查可能是不正确的。为什么要检查这个呢?让操作系统返回一个错误代码,如果不支持的话。

1 个回答

1

我之前也遇到过类似的问题,我想在一台64位的机器上,把超过4GB的数据块用mmap映射到64位编译的Python里。

如果我没记错的话,主要的问题在于,Python的基本对象struct里面有一个对象大小的成员,它只有32位。要想改变这个,难度非常大,几乎可以说是要重新改造整个语言,尤其是所有编译过的扩展。

我不太确定,但这可能是在Python 3.0的时候解决的。

撰写回答