Эффективное отображение пространства аппаратного ввода-вывода в виртуальное пространство 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 другим разработчикам программного обеспечения для разработки кода:

  1. Является ли MAP_SHARED правильным решением или мне также нужен MAP_NORESERVE? По сути, я обращаюсь к аппаратным регистрам, поэтому мне не нужно выделять пространство подкачки, правильно?

  2. Как мне убедиться, что чтение / запись в виртуальное пространство (выше mptr) не проходят через кеш? Ключевое слово volatile предназначено только для оптимизации компилятора.

  3. На самом деле все аппаратное пространство довольно велико - 16 МБ (много SRAM и много регистров). Может ли параметр длины для mmap быть настолько большим или это вызовет проблемы при создании таблиц страниц и отображении? Нужно ли мне создавать различные указатели виртуальной памяти, или я могу просто получить mptr, а затем просто добавить смещение физического адреса и счастливо читать / записывать аппаратные адреса?

Большое спасибо,

0 ответов

Другие вопросы по тегам