Эффективное отображение пространства аппаратного ввода-вывода в виртуальное пространство Linux
Я работаю над SoC со встроенным ARM и множеством аппаратных IP-блоков. Каждый аппаратный блок представляет собой память, отображаемую в пространство ARM, т. Е. Регистры для управления аппаратным блоком находятся в пространстве 32-битного адресного пространства ЦПУ ARM. У нас Linux работает на этом процессоре.
Чтобы получить доступ к аппаратным блокам, я использую mmap следующим образом в приложении, которое может работать от имени пользователя root:
fd = open("/dev/mem", O_RDWR | O_SYNC);
mptr = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, phy_addr);
Я хочу лучше понять некоторые вещи, прежде чем предоставлять BSP другим разработчикам программного обеспечения для разработки кода:
Является ли MAP_SHARED правильным решением или мне также нужен MAP_NORESERVE? По сути, я обращаюсь к аппаратным регистрам, поэтому мне не нужно выделять пространство подкачки, правильно?
Как мне убедиться, что чтение / запись в виртуальное пространство (выше mptr) не проходят через кеш? Ключевое слово volatile предназначено только для оптимизации компилятора.
На самом деле все аппаратное пространство довольно велико - 16 МБ (много SRAM и много регистров). Может ли параметр длины для mmap быть настолько большим или это вызовет проблемы при создании таблиц страниц и отображении? Нужно ли мне создавать различные указатели виртуальной памяти, или я могу просто получить mptr, а затем просто добавить смещение физического адреса и счастливо читать / записывать аппаратные адреса?
Большое спасибо,