Python, вызов mmap со слишком большим адресом вызывает исключение переполнения - PullRequest
9 голосов
/ 19 июля 2011

Я конвертирую некоторый C-код, который обращается к драйверу устройства через mmap.Я думал, что могу легко сделать очень похожие вещи в Python.Однако я столкнулся с этой проблемой.Адрес, который должен быть mmap'ed, предоставляется конфигурацией PCI, поэтому я не могу контролировать этот адрес.В этом случае найденный адрес - 3451912192. Поле адреса, конечно, является целым числом без знака и 32-разрядным.

Этот адрес, как правило, находится в диапазоне, где он помещается в целое число без знака, но нецелое число со знакомКогда я вызываю mmap, я получаю следующее исключение:

OverflowError: long int too large to convert to int

Так что Python искусственно сообщает мне, что число не подходит, потому что думает, что оно подписано.Можно ли как-то решить эту проблему, или мне нужно сделать вызов mmap в C?

Обратите внимание, что преобразование указателя в эквивалентное отрицательное значение дает:

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 Ответ

1 голос
/ 31 июля 2011

Однажды у меня была похожая проблема, я также хотел mmap кусок данных размером больше 4 ГБ на 64-битной машине в 64-битный скомпилированный Python.

Если я правильно помню основную причинуэто не сработало: самый фундаментальный python-объект struct содержит размер объекта член, который составляет всего 32bit .И изменить это так сложно, что вы могли бы сказать, что вам нужно пересмотреть весь язык и особенно исправить все скомпилированные расширения.

Я не уверен, но это могло быть сделано с Python 3.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...