Основная причина, по которой область памяти ввода-вывода - это чтение / запись чего-либо в эту память. Если указан адрес регистра, мы можем использовать readx / writex (x означает b / l / w).

Тогда почему мы должны использовать адрес, возвращаемый io_remap, который не что иное, как адрес конкретного регистра, указанного в листе данных?

0
ddpd 14 Апр 2014 в 17:58

2 ответа

Лучший ответ

ioremap - функция / макрос для конкретной архитектуры. На некоторых архитектурах он ничего не делает и просто возвращает адрес, указанный в качестве аргумента. Однако он может делать гораздо больше, чем на других архитектурах. Возьмем для примера arm или x86 - ioremap выполнит множество проверок, прежде чем, например, позволить вам использовать область памяти.

Однако более важным, чем эти проверки, является то, что ioremap может настроить сопоставление виртуальных адресов (из области vmalloc) с запрошенными физическими и гарантировать, что кеширование отключено для адресов, которые вы собираетесь использовать. . Таким образом, в большинстве случаев указатель, возвращаемый ioremap, не будет таким же, как просто числовой адрес из таблицы.

Вы хотите, чтобы кеширование было отключено, потому что регистры ввода-вывода управляются некоторыми внешними (с точки зрения процессора) устройствами. Это означает, что процессор не может знать, когда его содержимое изменилось, что сделало содержимое кеша недействительным.

0
Krzysztof Adamski 14 Апр 2014 в 17:26

Вещь, возвращенная request_mem_region, - это struct resource *, вы не используете ее для доступа к памяти ввода-вывода, и вам не нужно ничего с ней делать, кроме как проверять ее на NULL. request_mem_region не является частью сопоставления, которое вам нужно сделать для доступа к вводу-выводу, и ваш драйвер фактически (вероятно) работал бы без него, но, вызывая его, вы делаете некоторую информацию доступной в структурах данных ядра, и убедитесь, что два драйвера не пытаются использовать перекрывающиеся диапазоны памяти.

0
hobbs 14 Апр 2014 в 14:05