Как mmap () 64-битный адрес в 32-битный процесс? - PullRequest
5 голосов
/ 08 января 2020

Я пытаюсь отобразить память устройства, находящуюся на 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 бита моего желаемого адреса.

Любой идеи что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 08 января 2020

Вы должны использовать mmap64 здесь. Адрес должен быть отображен в область, которую может использовать 32-битный процесс. Однако я настоятельно советую вам получить истинную 64-битную версию этого приложения. Вы спускаетесь сюда по кроличьей норе, и в этой дыре много кроличьих какашек, если вы поймете мой занос ...

0 голосов
/ 27 января 2020

Хорошо, мое окончательное решение состояло в том, чтобы добавить смешанный код сборки 32/64, который переключается в длинный режим, загружает длинные регистры с желаемыми значениями, а затем системные вызовы без какой-либо оболочки и переключается обратно в защищенный. Работает как шарм.

...