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