Python, вызов mmap со слишком большим адресом вызывает исключение переполнения

Я конвертирую код C, который обращается к драйверу устройства через mmap. Я думал, что легко могу делать очень похожие вещи на Python. Однако я столкнулся с этой проблемой. Адрес, который необходимо указать в mmap, предоставляется конфигурацией 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 . По крайней мере, может показаться, что проверка смещения> 0 в mmap , возможно, неверна. Зачем это проверять? Пусть операционная система вернет код ошибки, если она не поддерживается.

9
задан Steve 20 July 2011 в 11:34
поделиться