Способ доступа к памяти ввода/вывода зависит от архитектуры компьютера, шины и устройства, хотя принципы везде одинаковы. В зависимости от используемой компьютерной платформы и используемой шины память ввода/вывода может быть доступна или недоступна через таблицы страниц. Когда доступ проходит через таблицы страниц, ядро должно сначала настроить, чтобы физический адрес был видимым из вашего драйвера, и это обычно означает, что вы должны вызывать ioremap перед выполнением каких-либо операций ввода-вывода. Если таблицы страниц не требуются, ячейки памяти ввода/вывода выглядят примерно так же, как порты ввода-вывода, и вы можете просто читать и писать с ними, используя надлежащие функции-обертки.
Распределение памяти ввода-вывода не является единственным необходимым шагом до того, как эта память может быть доступна. Вы также должны убедиться, что эта память ввода/вывода стала доступной для ядра. Получение памяти I/O - это не просто разглаживание указателя; на многих системах память ввода/вывода напрямую не доступна таким образом. Поэтому сначала нужно настроить сопоставление. Это роль функции ioremap. После установки ioremap (и iounmap) драйвер устройства может получить доступ к любому адресу памяти I/O, независимо от того, будет ли он непосредственно сопоставлен с виртуальным адресным пространством. Помните, однако, что адреса, возвращенные из ioremap, не должны быть разыменованы напрямую; вместо этого следует использовать функции доступа, предоставляемые ядром.
ioremap_nocache: Цитируя одного из заголовков ядра: «Это полезно, если некоторые регистры управления в такой области, и писать объединение или кэширования чтения не желательно»
Немногий из аксессора функций, читать из памяти ввода/вывода
unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);
Здесь адр следует адрес, полученный от ioremap (возможно, с целым числом смещения); возвращаемое значение - это то, что было прочитано из данной памяти ввода/вывода.
Существует аналогичный набор функций для записи в память ввода/вывода:
void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr);
https: //www.kernel.org/doc/htmldocs/deviceiobook/API-ioremap-nocache.html – Anshul
@ Ansh..i прочитал эту ссылку. Но я не смог прийти к точному выводу, почему ioremap_nocache используется после pci_iomap? – RDX