В чем разница между ioremap и файловой операцией mmap?

В настоящее время я работаю над драйвером устройства PCI для Ubuntu. У меня есть пример кода о PCI-драйвере, но мне сложно понять ioremap и file_operation.mmap.

Описание операции с файлом mmap:

Картирование памяти – одна из самых интересных особенностей современных Unix-систем. Что касается драйверов, то отображение памяти может быть реализовано для предоставления пользовательским программам прямого доступа к памяти устройства. Отображение устройства означает связывание диапазона адресов пользовательского пространства с памятью устройства. Всякий раз, когда программа считывает или записывает в заданном диапазоне адресов, он фактически обращается к устройству.

Описание ioremap:

Во многих системах память ввода / вывода напрямую недоступна. Поэтому сначала нужно настроить сопоставление. Это роль функции ioremap. Функция предназначена специально для назначения виртуальных адресов областям памяти ввода / вывода.

Вышеприведенное описание происходит от «makelinux». Но все же я не уверен, правильно ли понимаю разницу между этими двумя функциями. Пока я понимаю это так: fops.mmap (file operation mmap) связывает диапазон адресов пользовательского пространства с памятью устройства. Что означает для устройства pci, мы делаем реальную адресную карту для BAR устройства с fops.mmap . И с ioremap мы делаем виртуальную адресную карту для этих «реальных адресов», полученных от fops.mmap .

Может ли кто-нибудь сказать мне, если я ошибаюсь? Thx ~

PS. Я опубликовал это также в сообществе Ubuntu, надеюсь, что я не нарушил никаких правил.

Я предлагаю вам заглянуть в книгу LDD3 , это бесплатно. Это объясняет ioremap в главе 9, стр. 249. Также рассмотрите 3-е издание APIU , глава 14.8, стр. 525. Позвольте мне обобщить, насколько это возможно:

ioremap – это функция ядра, которая позволяет обращаться к аппаратным средствам через механизм, называемый памятью ввода-вывода. В памяти есть определенные адреса, которые перехватываются материнской платой между ЦП и ОЗУ и перенаправляются на другое оборудование, например диски или клавиатуру. Не уверен, что вы можете использовать обычную адресацию через указатели или некоторые другие функции ядра.

Память ввода-вывода – это просто область расположения в ОЗУ, которую устройство предоставляет процессору по шине. Эта память может использоваться для ряда целей, таких как хранение видеоданных или пакетов Ethernet, а также реализация регистров устройств, которые ведут себя точно так же, как порты ввода-вывода (т. Е. Имеют побочные эффекты, связанные с чтением и записью).

mmap – это syscall, доступный в пространстве пользователя, который отображает область памяти процесса в содержимое файла, а не RAM. Когда вы обращаетесь к этой отображаемой области памяти, используя обычную разметку указателя, ядро ​​переводит ее в файловую операцию. По существу запись в память становится записью в файл. Это просто более причудливый способ вызова write ().

С помощью ввода-вывода с памятью мы сопоставляем файл на диске в буфер в памяти, так что, когда мы извлекаем байты из буфера, считываются соответствующие байты файла. Аналогично, когда мы храним данные в буфере, соответствующие байты автоматически записываются в файл. Это позволяет нам выполнять ввод-вывод без использования чтения или записи.

(sidenote) Я думаю, что сначала называется «память с IO-памятью», а вторая называется «память с отображением IO». Неудивительно, что вы смущены.

Доступ к памяти пользовательского пространства ограничен адресами пользовательского пространства. Помимо отображения файла в память, mmap может использоваться для доступа к физической памяти, такой как регистры ввода-вывода. Вам нужен суперпользователь, чтобы открыть «/ dev / mem», затем mmap, чтобы отобразить область физической памяти, которая требуется. Затем вы можете читать и записывать регистры ввода-вывода. В большинстве систем физический адрес, который должен быть отображен, должен находиться на границе страницы.