Я пытаюсь отобразить память устройства, находящуюся на 64-битном адресе, в 32-битный процесс на 64-битной ОС. Я использую следующие строки
baseaddr = addr & ~(sysconf(_SC_PAGE_SIZE) - 1);
fd = open("/dev/mem", O_RDONLY | O_SYNC);
base_ptr = mmap(0, 4096, PROT_READ, MAP_PRIVATE, fd, baseaddr);
baseaddr равен uint64_t и больше 4 ГБ.
, и я компилирую с -D_FILE_OFFSET_BITS=64
. Когда я запускаю программу, она возвращает EINVAL
. Раньше он работал без -D_FILE_OFFSET_BITS=64
, но в нем использовались только младшие 32 бита baseaddr, которые я выводил из вывода pmap -d, показывающего младшие 32 бита моего желаемого адреса.
Любой идеи что я делаю не так?