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